1、什么是索引?
索引是帮助数据库高效获取数据的数据结构。比如你之前没加索引,sql语句执行需要1秒,加入索引后可能需要0.1秒
2、索引类型有哪些?
索引常见类型主要有二叉树、hash表、B树
1)二叉树:
定义:每一个节点有2个子节点,左侧节点小于父节点,右侧节点大于父节点。
极端情况:每一个节点都只要右侧节点,而且所需要的值正好在最后一个节点上,此时相当于全表查询。
缺点:树的层数太高,查询速度慢
2)hash表:
定义:对所创建的列进行hash计算,将hash值作为key,value就是指向数据的指针。计算出来的同一个hash值,索引以链表的形式存放多个指针。
优点:对于等值查询速度比较快。
缺点:不能进行范围查询。如果遇到大量hash值相同的情况性能比较差。如果删除某一行,需要遍历所有行,找到对应行的引用,性能差。
3)B树
mysql默认引擎是innodb,默认选择B+树索引。
B+树是平衡多路查找树。系统从磁盘读取数据到内存中,是以磁盘块为基本单位的。位于同一个磁盘快中的数据会同时被一次性读取出来。mysql以页为最小单位,一页默认为16k。
(1)B+树的特点:
①I/O次数少。
B+树是只有叶子节点存储数据和索引键值对,其他节点存储索引键值对。同一页中存储的数据就更多了,层数就会变低。整体呈现“矮胖”
②范围查询快。
B+树的叶子节点以指针的形式连接起来,每一个叶子节点会指向下一个叶子节点的指针。这样范围查找的时候,直接找到一个叶子节点后,就在叶子节点之间进行查询,不需要再从根节点进行遍历。
③查询性能稳定
B+树只有叶子节点会存储数据,所有的查询都必须到叶子节点才能结束。
3、聚簇索引、非聚簇索引、联合索引
1)聚簇索引
就是主键索引,在叶子节点存储数据。
只查询一次就可以得到数据库中的数据
2)非聚簇索引
在叶子节点存储的数据是主键的值。
查询到叶子节点后,根据主键的值,再去查找聚簇索引的树,从而找到数据库中数据。这个过程称为“回表”
索引覆盖:查询的列恰好是索引的一部分,查询就只需要在索引文件中进行查找。
3)联合索引(又叫复合索引)
两个或两个以上的列组成的一个索引叫联合索引
注意点:需要注意索引的创建顺序。
因为索引遵循最左原则,从联合索引的最左边开始匹配。比如创建了(a,b,c),如果where条件是a=1 and c=3,那么该索引只能使用一半,即(a,b,c)创建后,支持(a),(a,b),(a,b,c)这三种的组合进行查找。不支持(b)(b,c)等查找。
一般是根据业务需要,使用频率高的放在最左边。
4、索引使用场景
1)可以使用索引
字段有唯一值,where查询条件跟group by和order by后面的列。
2)索引失效
①like查询以“%”开头
②查询条件有计算,有or连接
3)不需要创建索引
①字段值大量重复
②表中数据量太少
5、创建索引时考虑哪些因素
1)数据库开启慢查询日志,设置一个慢查询阀值
2)找到对应的慢查询sql,使用explain命令,分析索引是否生效,有没有全盘扫描,有没有创建索引等。