精华内容
下载资源
问答
  • 索引的类型和常见的索引

    千次阅读 2018-03-02 14:48:16
    索引的类型(索引有很多种类型,在mysql中,并没有统一的索引标准,不同的存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引) 1、B-Tree索引 大多数MySQL引擎都支持这种索引,对索引列是...

    索引的类型(索引有很多种类型,在mysql中,并没有统一的索引标准,不同的存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引)

           1、B-Tree索引   大多数MySQL引擎都支持这种索引,对索引列是顺序组织存储的,很适合查找范围数据。如:像找出所有以I到K开头的名字“这样的查找效率会非常高。适用于全键值,键值范围或键前缀(最左前缀的查找)查找。

            2、哈希索引    哈希索引只包含哈希值和行指针,而不存储字段值。

                                                 无法用于排序,不是按照索引值顺序存储的

                                                  不支持部分索引列匹配查找(哈希索引是使用索引列的全部内容来计算哈希值得)

                                                   只支持等值比较查询,包括=、IN()、<=>

                                                    不支持任何范围查询

           3、空间数据索引(R-Tree)

                  MyISAM索引支持空间索引。 无须前缀查询,会从所有维度索引数据

            4、全文索引

             5、其他索引类别

                   (第三方的存储引擎来存储索引,如:TokuDB 分形树索引)




    常见的索引有:

          1. 普通索引(无限制)

            2.唯一索引

                      主键就是唯一索引,但是唯一索引不一定是主键,唯一索引可以为空,但是空值只能有一个,主键不能为空。
    普通唯一索引:单个字段上建立唯一索引,需要此字段所在的列上不能有重复的值,属于二级索引。

    复合唯一索引:多个字段上联合建立唯一索引,属于二级索引。(参考了:https://www.jianshu.com/p/e1dce41a6b2b

             3.单列索引

             4.多列索引(前缀)

             5.覆盖索引 : 一个索引包含(或者说覆盖)所有需要查询的字段的值 

             6.聚族索引

                  InnoDB 主键使用的是聚簇索引,MyISAM 不管是主键索引,还是二级索引使用的都是非聚簇索引。

                  聚族索引不是一种单独的索引类型,而是一种数据存储方式。InnoDB的聚族索引在同一结构中保存了B-Tree索引和数据行。数据行存放在索引的叶子页中,术语"聚族"表示数据行和相邻的键值紧凑地存储在一起。存储引擎负责实现索引(不是所有的存储引擎都支持聚族索引)。

                  InnoDB将通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚族索引。

                   优点:1、数据访问更快,聚族索引将索引和数据保存在同一个B-Tree中,因此比在非聚族索引中获取数据更快。

                           2、使用覆盖索引扫描的查询可以直接使用页节点的主键值。

                    缺点: 1.插入速度严重依赖于插入顺序。按照主键的顺序插入是加载数据到InnoDB表中速度最快的方式。但如果不是按主键插入,最好使用optimize table命令重新组织表

                               2.更新聚族索引列的代价很高。因为会强制InnoDB将每个被更新的行移动到新的位置。

                               3..基于聚族索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临“”页分页“的问题。

    当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将改页分页成两个页来容纳该行,这就是一次页分页操作,会导致表占用更多的磁盘空间。聚族索引可能导致全表扫描变慢,尤其是行比较稀疏或者是页分裂存储不连续的时候。

                               二级索引叶子节点保存的不是指向行的物理位置的指针,而是行的主键值。

            

             7.全文索引

                        InnoDB 主键使用的是聚簇索引,MyISAM 不管是主键索引,还是二级索引使用的都是非聚簇索引。




    版权声明:本文为博主原创文章,未经博主允许不得转载。

    展开全文
  • 索引+索引的类型+创建索引

    千次阅读 2018-09-10 13:53:45
    索引  1在关系数据库中,索引是一种与表有关的数据库结构,它是除了表以外的另一个重要模式对象。...5建立索引需要消耗空间大小为表的1.2倍 索引的类型  B树索引,反向键索引,位图索引,基于函...

    索引 
    1在关系数据库中,索引是一种与表有关的数据库结构,它是除了表以外的另一个重要模式对象。 
    2索引建立在表的一列或多列上的辅助对象,目的是提高表中数据的访问速度. 
    3索引是表示数据的另一种方式,它提供的数据顺序不同于数据在磁盘上的物理存储顺序。 
    4索引的特殊作用是在表内重新排列记录的物理位置 
    5建立索引需要消耗空间大小为表的1.2倍 
    索引的类型 
    B树索引,反向键索引,位图索引,基于函数的索引,簇索引,全局索引,局部索引等.

    创建索引 
    语法: 
    create unique | btimap index < schema>.< index_name> 
    on < schema>.< table_name> 
    (< column_name > | < expression> asc |desc 【,……】) 
    tablespace< tablespace_name> 
    storage< storage_settings> 
    logging | nologging 
    compute statistics 
    nocompress | compress< nn> 
    nosort | reverse 
    partition |global partition< partition_setting>;

    unique :表示创建的表中的每一行在索引中 都是具有唯一值,也就是创建唯一索引 
    btimap :创建一个位图索引。 
    如果不指定unique ,btimap 那么表示创建的索引是B树索引. 
    < schema>.< index_name>:索引名称 
    < schema>.< table_name>:指定索引基于哪个用户模式下的哪个表 
    column_name :指定表中的列,可以多个列,逗号分隔,可以指定列的排列方式,默认asc。 
    tablespace< tablespace_name>:指定存储表空间 tablespace_name 
    storage< storage_settings>:表示用户可以对存储在表空间的存储参数进行设置,如果不指定该字句,那么使用表空间的默认存储参数。 
    logging | nologging:在创建索引的时候,是否创建相应的日志记录,默认logging. 
    nologging好处更快完成创建索引的操作,缺点:不会产生重做日志信息。 
    compute statistics:oracle在创建索引的过程中,直接生成关于索引的统计信息,这样可以避免以后对索引进行分析操作. 
    nocompress | compress< nn>:该选项是对复合索引而言的,compress在创建索引时候,对重复的索引进行压缩,以节省存储空间。默认是nocompress ,表示不进行任何压缩,因为压缩会影响使用效率。 
    nosort : 创建索引时候,不进行排序,加快索引创建速度,节省排序空间。 
    也就是告诉oracle该表中已经存在的数据已经根据column_a排序,你不需要再去给我排序了;如果表中记录是无序的,在使用norsort会有错误信息。 
    reverse:反转 
    partition|global partition< partition_setting>;多个服务并行来创建索引。

    下面内容转载 
    http://3y.uu456.com/bp_8e7pq1xu8a8wrp7237uy_1.html 
    1.2 索引特点:

    第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

    第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

    第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

    第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

    1.3 索引不足:

    第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

    第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

    第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    1.4 应该建索引列的特点:

    1)在经常需要搜索的列上,可以加快搜索的速度;

    2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;

    3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;

    4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;

    5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;

    6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

    1.5 不应该建索引列的特点:

    第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。

    第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。

    第三,对于那些定义为blob数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。

    第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

    1.6 限制索引

    限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题:

    1.6.1 使用不等于操作符(<>、!=)

    下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。 select cust_Id,cust_name from customers where cust_rating <> ‘aa’;

    把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。

    select cust_Id,cust_name from customers where cust_rating < ‘aa’ or cust_rating > ‘aa’; 特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。

    1.6.2 使用IS NULL 或IS NOT NULL

    使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成 NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引,关于位图索引在稍后在详细讨论)。

    1.6.3 使用函数

    如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。 下面的查询不会使用索引(只要它不是基于函数的索引)

    select empno,ename,deptno from emp where trunc(hiredate)=’01-MAY-81’;

    把上面的语句改成下面的语句,这样就可以通过索引进行查找。

    select empno,ename,deptno from emp where hiredate<(to_date(‘01-MAY-81’)+0.9999);

    1.6.4 比较不匹配的数据类型

    也是比较难于发现的性能问题之一。 注意下面查询的例子,account_number是一个VARCHAR2类型,在account_number字段上有索引。

    下面的语句将执行全表扫描:

    select bank_name,address,city,state,zip from banks where account_number = 990354; Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:

    select bank_name,address,city,state,zip from banks where account_number =’990354’;

    特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次“全表扫描”。

    1.7 查询索引

    查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。

    1.8 组合索引

    当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。在 Oracle9i引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。比如:表emp有一个组合索引键,该索引包含了empno、 ename和deptno。在Oracle9i之前除非在

    where之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。

    特别注意:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引!

    1.9 ORACLE ROWID

    通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。ROWID其实就是直接指向单独行的线路图。如果想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。

    1.10 选择性

    使用USER_INDEXES视图,该视图中显示了一个distinct_keys列。比较一下唯一键的数量和表中的行数,就可以判断索引的选择性。选择性越高,索引返回的数据就越少。

    1.11 群集因子(Clustering Factor)

    Clustering Factor位于USER_INDEXES视图中。该列反映了数据相对于已建索引的列是否显得有序。如果Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目,表中的数据就越有序。如果它的值接近于表中的行数,则表中的数据就不是很有序。

    1.12 二元高度(Binary height)

    索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用。在对一个索引进行分析后,可以通过查询DBA_INDEXES的B- level列查看它的二元高度。二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。索引上如果有大量被删除的行,它的二元高度也会增加。更新索引列也类似于删除操作,因为它增加了已删除键的数目。重建索引可能会降低二元高度。

    1.13 快速全局扫描

    从Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)这个选项。这个选项允许Oracle执行一个全局索引扫描操作。快速全局扫描读取B-树索引上所有树叶块。初始化文件中的 DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。

    1.14 跳跃式扫描

    从Oracle9i开始,索引跳跃式扫描特性可以允许优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。

    下面的比较他们的区别:

    SQL> set timing on

    SQL> create index TT_index on TT(teamid,areacode);

    索引已创建。

    已用时间: 00: 02: 03.93

    SQL> select count(areacode) from tt;

    COUNT(AREACODE)


    7230369

    已用时间: 00: 00: 08.31

    SQL> select /+ index(tt TT_index )/ count(areacode) from tt;

    COUNT(AREACODE)


    7230369

    已用时间: 00: 00: 07.37

    展开全文
  • innodb存储引擎 索引的类型和使用

    千次阅读 2019-02-19 08:50:32
    索引的类型和使用 1.索引的类型及其特点 1.1类型 普通索引 唯一索引 全文索引(FULLTEXT)

    mysql存储结构

    mysql的基础存储结构为页
    在这里插入图片描述
    特点:

    每一页都是一个双向链表。
    每一页的记录又组成单向链表。
    每一页都会为它存储的数据记录生成页目录,

    分析

      主键作为搜索条件:查找数据可以通过二分法查找快速找到对应的槽位,通过槽位快速找出对应的分组并找到数据。
      其他非主键作为搜索条件:遍历双向链表找到对应页,通过遍历对应页单向链表来查找数据。

    为了解决遍历双向链表慢的问题,引入B+树数据结构

    B+树索引结构解释

    在这里插入图片描述
    浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。
    使用聚合索引(主键索引,没有主键则默认生成一个六位的主键),这个聚合索引的叶子节点保存的是数据页
    后面创建的非聚合索引的叶子节点保存的是主键,然后通过主键在聚合索引中查找对应的数据页

    索引的类型和使用

    1.索引的类型及其特点

    1.1类型

    1. 普通索引
    2. 唯一索引
    3. 主键索引:也就是聚簇索引
    4. 全文索引(FULLTEXT)
    5. 聚集索引
    6. 非聚集索引

    聚集索引和非聚集索引的区别

    聚族索引:主键索引是聚族索引。表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。
    非聚族索引:表数据存储顺序与索引顺序无关。对于非聚集索引,叶结点包含索引字段值及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。

    2.索引的数据结构

    B+树解决了B树的问题:

    1. 无法进行范围存储
    2. 无法定位行数据

    解决方案:

    1. 数据行单独存储;节点中增加一个字段,定位key对应数据行的位置。
    2. 修改key与子树的判断逻辑,使子树大于等于上一key小于下一key,最终所有访问都将落于叶子节点;叶子节点中直接存储数据行或数据行的位置。
    3. 由于所有数据行都存储在叶子节点,B树的叶子节点本身也是有序的,可以增加一个指针,指向当前叶子节点按主键顺序的下一叶子节点;查询时先查到左界,再查到右界,然后从左界到有界线性遍历.

    索引使用流程
    在这里插入图片描述
    通过三个部分进行分析

    1. Index Key :MySQL是用来确定扫描的数据范围,实际就是可以利用到的MySQL索引部分,体现在Key Length。
    2. Index Filter:MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后,可以用上索引的部分。
    3. Table Filter:MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤。

    流程

    1.使用mysql查询优化器,通过改变查询条件的排列顺序,以确定查询的最优解的查询条件排列顺序。
    2.利用=、>=、<=来确定下边界(first key),利用最左原则,确定可以使用的索引
    3.使用索引,筛选出符合条件的数据
    4.MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤。
    
    展开全文
  • (一)索引的类型 唯一索引 索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。 主键索引 是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表设置

    本篇中记录下数据库索引相关的知识点!

    索引是什么?
    举个例子;大家去图书馆借书时,会先在电脑检索书名或作者等关键字信息,查询出该本书对应的一个图书索引后,紧接着就可以拿着这个图书索引去精确定位存放该索引范围内的书架并找到这本书!
    所以数据库索引也是这个作用,通过在表的一列或多个列上建立索引对象,用于加快数据的检索。但索引也有缺点,过多的索引会占用硬盘空间以及导致insert、update、delete语句的执行效率降低!

    (一)索引的类型

    1. 普通索引和唯一索引:
      普通索引: MySQL中最基础的索引类型,允许在定义索引的列中插入重复值和空值。
      唯一索引:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值和组合必须唯一。
      主键索引是一种特殊唯一索引,不行允许有空值。
    2. 单列索引和组合索引:
      单列索引:一个索引只包含一个列,一个表也可以有多个单列索引。
      组合索引:在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时遵循最左前缀集合。
    3. 全文索引:
      全文索引类型为FULLTEXT,在定义索引的列上支持全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在CHAR,VARCHAR或者TEXT类型上创建。只有MyISAM存储引擎支持全文索引。
    4. 空间索引:
      空间索引是对空间数据类型的字段建立索引,Mysql中的空间数据有4中:GEOMETRY、POINT、LINESTRING和POLYGON。Mysl使用SPATIAL关键字进行扩展,使得能够创建正规索引类似的语法创建空间索引。创建空间索引的列,必须将其声明为NOT
      NULL,空间索引只能在存储引擎为MyISAM中创建。

    (二)索引的命名规范

    一般来说,每家公司可能存在自己的一套规范;也可参照以下的比较通用的索引命名规则(通过索引类型简写前缀 + 下划线_ + 字段名(组合索引多个字段则继续加_)拼接而成,名称需使用小写字母,同时避免用到MySQL保留关键字):

    • 唯一索引:使用uni_[字段名]来命名,比如用户名唯一索引uni_username
    • 非唯一索引:使用idx_[字段名]来命名,比如用户名普通索引idx_username,用户名手机号组合索引idx_username_phone

    索引的最佳规则:Primary key > Unique key > 一般索引

    (三)索引的建立原则

    • 定义有主键和外键的字段列一定要建立索引(数据库默认建立主键索引);
    • 对于查询频率高,频繁作为 WHERE 条件且不同值较多的列,以及频繁出现在关键字ORDER BY、GROUP BY、DISTINCT后面的列,需要建立索引;
    • 经常与其他表进行JOIN连接的表,在连接字段上应该建立索引;
    • 对于那些查询中很少涉及的列,重复值比较多的列(一般为逻辑型字段,比如性别,只有男、女、其他三种值,这种字段区分度不高)不要建立索引;
    • 频繁更新的字段不适合建立索引;
    • 索引应该建在小字段上,对于定义为text等文本数据类型的列不要建立索引;
    • 表的数据量很少的情况下不适合建立索引;
    • 限制每张表上的索引数量,不超过5个;

    (四)索引失效的情况

    下面列举一些索引失效的情况(MySQL8.0版本,根据explain分析执行计划中的key信息是否用到索引):

    1. where条件中使用OR

    分以下三种情况(user表的索引有主键索引和唯一索引uni_phone):

    • OR连接的字段若有非索引字段,则索引失效:
      在这里插入图片描述
    • OR连接的字段若是两个不同的索引字段或者同一个组合索引的不同字段,则索引失效(可以用UNION代替OR):在这里插入图片描述
    • OR连接的字段若是两个相同的索引字段,则索引生效(可以用IN代替OR):在这里插入图片描述
    2. where条件中使用LIKE

    分以下两种情况(user表的索引有主键索引和唯一索引uni_phone):

    • LIKE的值中带%或者_的前缀匹配符,则索引失效:
      在这里插入图片描述
    • LIKE的值中带%或者_的通配符,但不置于其前缀,则索引生效:
      在这里插入图片描述
    3. where条件中使用了 组合索引,但没有遵循最左前缀原则

    组合索引的最左前缀原则:假如在只建立了一个组合索引(a,b,c)的情况下,那么实际上相当于建立了(a), (a,b), (a,b,c)共三个索引。
    但根据最左前缀原则,在使用索引时,只有where a = 'test1'where a = 'test1' AND b = 'test2where a = 'test1' AND c = 'test3以及where a = 'test1' AND b = 'test2 AND c = 'test3'会索引生效(条件中的字段顺序可以打乱,但字段必须得满足);
    而类似于where b = 'test2'where c = 'test3'以及where b = 'test2 AND c = 'test3'则索引失效;

    例子(user表的索引有主键索引和组合索引idx_username_email_phone):
    索引失效的情况:
    在这里插入图片描述
    索引生效的情况:在这里插入图片描述

    4. where条件中对索引列使用函数

    user表的索引有主键索引和唯一索引uni_username,在查询中对索引字段username使用了函数,因此这种情况下索引失效:在这里插入图片描述

    5. where条件中对索引列使用数学运算

    比如对主键索引执id执行id/2,则会出现索引失效:在这里插入图片描述
    所以在实际中我们应该改成id = a/2,这时就会索引生效:
    在这里插入图片描述

    6. where条件中存在对索引列的数据类型隐式转换

    user表的索引有主键索引和唯一索引uni_phone,且phone字段类型为varchar类,但在查询条件中没有加引号,所以存在隐式转换,因此这种情况下索引失效:在这里插入图片描述

    7. where条件中存在NOT EXISTS

    使用到NOT EXISTS语法会索引失效(user表的索引有主键索引):
    在这里插入图片描述

    8.where条件中存在NULL

    存在IS NULL或者IS NOT NULL的null值判断,分两种情况(user表的索引有主键索引和唯一索引uni_username):

    • 当查询的数据不仅只有索引字段列时,则索引失效:

    在这里插入图片描述

    • 当查询的数据只有索引字段列时,则索引生效(实际中基本不会这么用):
      在这里插入图片描述

    注意:以上是MySQL8.0版本的索引失效情况,但在MySQL5.7版本中,除了以上这些情况外,还包括下面的情况会索引失效:

    1. MySQL5.7,表关联时,关联字段字符集不一致会导致索引失效
    2. MySQL5.7,使用 != 或 IN 或 NOT IN 且返回值不只有索引列
    展开全文
  • 索引的类型及结构

    千次阅读 2013-06-20 10:57:39
    1、索引的类型  (1、 按逻辑分,逻辑分类从应用程序的角度对索引进行分组  ◎ 单列索引和组合列索引。  ◎ 唯一性索引和非唯一性索引  ◎ 函数索引  ◎ 应用程序域索引 --------------------------------...
  • 索引的类型 与使用接口描述函数类型差不多,我们也可以描述那些能够“通过索引得到”的类型,比如a[10]或ageMap["daniel"]。 可索引类型具有一个 索引签名,它描述了对象索引的类型,还有相应的索引返回值类型。 ...
  • MongoDB索引的类型

    千次阅读 2016-05-04 14:45:43
    索引的概念 数据库索引是对数据表中一列或多列的值进行排序的一种数据结构,使用索引可以快速访问数据库表中的特定信息。 数据库索引的功能类似于书籍的索引,书籍有了索引就不需要翻查整本书。与此类似,在...
  • TypeScript基础入门 - 接口 - 可索引的类型 项目实践仓库 https://github.com/durban89/typescript_demo.git tag: 1.0.11 为了保证后面的学习演示需要安装下ts-node,这样后面的每个操作都能直接运行看到输出的...
  • 索引是数据表种一个或者多个列进行排序数据结构 索引能够大幅提升检索速度 创建、更新索引本身也会耗费空间和时间 二、查找结构进化史 线性查找:一个个找;实现简单;太慢 二分查找:有序;简单;要求是有序...
  • 索引的类型分类、区别、优缺点

    千次阅读 多人点赞 2018-06-26 16:38:09
    导读:索引是在存储引擎中实现,也就是说不同存储引擎,会使用不同的索引。MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE,不能够更换。MEMORY/HEAP存储引擎:支持HASH和BTREE索引。 mysql...
  • php mysql索引的类型和优缺点

    千次阅读 2017-07-11 09:48:51
    针对MySQL索引的特点、应用进行了详细的描 述。分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用。 那就下来我们就说一下什么是索引吧  索引就是一种特殊的文件(InnoDB...
  • 索引的优缺点 常见的索引结构有: B 树, B+树和 Hash。 优点:加快数据的检索速度 缺点: 创建索引和维护索引需要耗费许多时间:当对表中的数据进行增删改的时候,如果数据有索引,那么索引也需要动态的修改,会...
  • MySQL索引的类型和优缺点

    万次阅读 2014-10-28 08:49:03
    针对MySQL索引的特点、应用进行了详细的描 述。分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用。本文摘自《MySQL 5权威指南》(3rd)的8.9节。 索引是一种特殊的文件(InnoDB...
  •   ...用来描述可以通过索引得到值的类型。 interface StringArray { [index: number]: string; } let myArray: StringArray; myArray = ["Bob", "Fred"]; let myStr: ...
  • 2.10 索引的类型下面列出了本节要讨论的索引类型:● B树索引● 位图索引● HASH索引● 索引组织表索引● 反转键(reverse key)索引● 基于函数的索引● 分区索引(本地和全局索引)● 位图连接索引2.10.1 B...
  • mysql索引的类型和优缺点

    千次阅读 2012-09-12 23:09:11
    针对MySQL索引的特点、应用进行了详细的描 述。分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用。本文摘自《MySQL 5权威指南》(3rd)的8.9节。 索引是一种特殊的文件(InnoDB...
  • 数据库五种索引类型

    万次阅读 多人点赞 2019-03-15 21:24:13
    本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname='css',如果要拿这条数据的话需要些的...
  • 索引的类型 索引有很多种类型,可以为不同的场景提供更好的性能。在MySQL中,索引是在存储引擎层而不是服务器层实现的。所有,并没有统一的索引标准:不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都...
  • MongoDB 中索引的类型大致包含单键索引、复合索引、多键值索引、地理索引、全文索引、 散列索引等,下面简单介绍各类索引的用法。 1、单字段索引 这个是最简单最常用的索引类型,比如我们上边的例子,为id建立一个...
  • Mysql几种索引类型的区别及适用情况

    万次阅读 多人点赞 2013-07-30 18:39:38
    如大家所知道,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 那么,这几种索引有什么功能和性能上不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER...
  • MySQL的索引类型及创建索引

    万次阅读 2019-03-05 14:04:27
    MySQL目前主要有以下几种索引类型: 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 二、语法 CREATE TABLE table_name[col_name data type] [unique|fulltext][index|key][index_name](col_name...
  • MySQL数据库索引类型

    2018-10-27 14:16:59
    在数据量偏大的时候执行查询语句查询时间会变长,这时我们会根据需求在数据库中添加索引来加快查询... 下面来看看索引的类型: 1.Normal普通索引 普通索引也是我们最常用的索引,在使用时限制很少。比如上面为dm...
  • 遇到单表数据量大的时候很多开发者都会想到给相对的字段建立索引来提高性能(mysql索引的使用),但很少会去关注索引的类型该如何选择,在mysql中支持有两种类型,最常用的也是默认的Btree类型,其次就是最容易被...
  • 索引类型

    千次阅读 2012-10-18 12:53:35
    主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个...
  • 索引的几种类型分别是普通索引、唯一索引、聚集索引、主键索引、全文索引。 唯一索引:在创建唯一索引时要不能给具有相同的索引值。 主键索引:在我们给一个字段设置主键的时候,它就会自动创建主键索引,用来...
  • Mysql索引类型

    千次阅读 2020-04-16 17:40:13
    一、按逻辑角度划分1、主键索引:主键...使用复合索引时遵循最左前缀集合4、唯一索引或者非唯一索引5、空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中空间数据类型有4种,分别是GEOMETRY、POINT...
  • Oracle 索引扫描4种类型

    千次阅读 2013-09-17 17:58:53
    根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描: 3,4可归一种 (1) 索引唯一扫描(index uniquescan) (2) 索引范围扫描(index range scan) (3) 索引全扫描(index full scan) (4) 索引...
  • 什么是索引?Mysql目前主要几种索引类型

    万次阅读 多人点赞 2018-02-27 10:11:16
    一、索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。...
  • mysql 的索引类型

    2017-11-30 23:20:56
    B-tree索引的特点 B-tree索引以B+树的结构存储数据 在什么情况下可以使用到B树索引 全职匹配的查询 order_sn='9898989656565' 匹配最做前缀的查询 匹配列前缀的查询 order_sn like '9876%' 匹配范围...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,452
精华内容 23,780
关键字:

索引的类型