栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

一篇文章带你搞懂数据库索引

一篇文章带你搞懂数据库索引

一:数据库索引

我们常见的有数据库索引有几种:1、B+索引 2、唯一索引 3、非唯一索引 4、主键索引 5、聚集索引(聚簇索引)下面我们来看看各自索引的特点:
1、B+索引: 索引的作用是排列好次序,使得查询可以快速找到。

2、唯一索引: 唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复,例如学生表的学号。

3、非唯一索引: 非唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,例如学生表的成绩。

4、主键索引: 主键索引(主索引)是唯一索引的特定类型。表中创建主键时自动创建的索引。一个表只能建立一个主索引

5、聚集索引: 表中记录的物理顺序与键值的索引顺序相同,一个表只能有一个聚集索引
聚集索引与非聚集索引的区别?分别在什么情况下使用?
聚集索引和非聚集索引的根本区别在于表中记录的物理顺序和索引的排列顺序是否一致。
优点是: 查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理的紧跟其后。
缺点是: 对表进行修改的速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页进行重排,降低了执行速度。在插入新纪录时数据文件为了保持B+树的特性而频繁的分裂调整,十分低效。
建议使用聚集索引的场合:

  • 某列包含了小数目的不同值
  • 排序和范围查找

其他方面的区别
1、聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。而聚集索引的叶子节点就是数据节点,而非聚集索引的节点仍然是索引节点。
2、非聚集索引添加记录时,不会引起数据顺序的重组,看上去聚集索引的效率明显要低于非聚集索引,那聚集索引的优势在哪?

  • 由于行数据和叶子节点存储在一起,这样主键和行数据是一起载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键Id来组织数据,获得数据更快。
  • 辅助索引使用主键作为指针,而不是使用地址值作为指针的好处是,减少了当行移动或者数据页分裂时,辅助索引的维护工作,innoDB在移动时无需更新辅助索引中的这个指针,也就是说行的位置会随着数据库里数据的修改而发生改变,使用聚集索引就可以保证不用管这个主键B+树的节点如何变化,辅助索引树都不受影响。
    建议使用非聚集索引的场合
  • 此列包含了大数目的不同值
  • 频繁更新的列
二:索引的实现机制 2.1.MyISAM引擎

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图:

这里设表一共三列,假设我们以Col1为主键,则上面是一个MyISAM表的主索引示意图,可以看出MyISAM的索引文件仅仅保存数据记录的地址,在MyISAM中,主索引与辅助索引在结构上没有任何的区别,只是主索引要求key是唯一的,而辅助索引的key是可以重复的。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:

同样是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值,然后以data域的值为地址,读取相应的数据记录。

2.2.InnoDB引擎

InnoDB也是用B+Tree作为索引结构,但具体实现方式与MyISAM不同。
第一个重大的区别是InnoDB的数据文件本身就是索引文件。从上文知道MyISAM索引文件和数据文件是区分开来的,索引文件仅仅保存数据记录的地址,而在InnoDB中,表数据文件本身就是B+Tree组织的一个索引结构,这棵树的叶子节点data域保存了完整的数据记录,这个索引的key是数据表的主键,因此InnoDB数据文件本身就是主索引

上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录,这种索引叫做聚集索引,因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须要有主键(MyISAM可以没有),如果没有显示指定,则MySQL会自动选择一个可以唯一标示数据记录的列作为主键,如果不存在这种列,则MySQL自动为表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

第二个与MyISAM索引不同的是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:

这里一英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

了解不同存储引擎的索引实现方式对于正确使用和优化索引都有帮助,例如知道了InnoDB的索引实现后,就容易知道为什么会不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会导致辅助索引变得过大,再例如用非单调的字段作为主键在InnoDB也不是个好主意,因为InnoDB数据文件本身是一颗B+Tree树,非单调的主键会造成再插入新纪录时为了维护B+Tree的特性而频繁的分裂调整,十分低效,所以使用自增字段作为主键是一个很好的选择

三:索引建立原则
(id,name) where id =1 and name="xxxx"

1.最左匹配原则
mysql会一直向右匹配直到遇到范围查询(>, <,between,like)就停止匹配,范围查询会导致组合索引半生效,比如a=1 and b=2 and c>3 and d=4如果建立(a,b,c,d)顺序的索引,c可以使用到索引,但d使用不到索。如果是建立(a,b,d,c)的索引则都可以使用到。所以一般来说where范围查询要放在最后。

2.特别注意: and之间的部分可以乱序,比如a=1 and b=1 and c=1建立(a,b,c)索引可以任意顺序,mysql的查询优化器会优化成索引可以识别的形式。where字句中有or出现时还是会遍历全表

3.尽量选择区分度高的字段作为索引: 某字段的区分度公式是count(distinctcol)/count(*),表示字段不重复的比例,比例越大,我们扫描的记录数越少,查找匹配的时候可以过滤更多的行,唯一索引的区分度是1,有些字段的区分度比如性别字段在数据量大的情况下就是0

4.不在索引列做运算或者使用函数

5.like模糊查询中,右模糊查询(例如 321%)会使用到索引,而%321%或者%321则会放弃使用索引而使用全局扫描

6.尽量扩展索引,不要新建索引,比如表中已经有了a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引就可以

7.where子句中经常使用的字段应该创建索引,分组字段或者排序字段应该创建索引,两个表的连接字段应该创建索引

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/278502.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号