1.索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据。
常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树
B+ Tree索引和Hash索引区别 哈希索引适合等值查询,但是不无法进行范围查询 哈希索引没办法利用索引完成排序 哈希索引不支持多列联合索引的最左匹配规则 如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。
关于聚族索引和非聚族索引:在InnoDB里面,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。
而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。
所以聚族索引查询的更快一点,因为主键索引树的叶子节点直接就是我们要查的整行数据。
而非聚族索引的叶子节点是主键的值,查到主键的值以后,还要再通过主键的值再进行查询一次,这个过程叫回表。
联合索引、最左前缀匹配
1.查询概率比较高,经常作为where条件的字段设置索引
2.根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。
3.MySQL 5.6中,对索引做了哪些优化?
有一个比较重要的 :Index Condition Pushdown Optimization(索引下推)
MySQL 5.6引入了索引下推优化,默认开启,使用SET optimizer_switch = 'index_condition_pushdown=off';可以将其关闭
例如:
SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';
如果没有使用索引下推技术,则MySQL会通过zipcode='95054'从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断数据是否符合条件。 如果使用了索引下推技术,则MYSQL首先会返回符合zipcode='95054'的索引,然后根据lastname LIKE '%etrunia%'和address LIKE '%Main Street%'来判断索引是否符合条件。如果符合条件,则根据该索引来定位对应的数据,如果不符合,则直接reject掉。 有了索引下推优化,可以在有like条件查询的情况下,减少回表次数。