基础原理MySQL

MYSQL(05)-索引原理

2019-07-14  本文已影响74人  小亮__

Mysql两种索引结构:B+Tree索引和Hash索引的区别和使用场景

B+Tree作为mysql数据库索引原理

MYISAM和INNODB索引B+TREE的区别

索引覆盖

在上图中可以看到,如果使用name作为的索引,属于二级索引,查询条件为name的时候先查询到name索引中指定的主键,然后再回表查询,这样"回表"查询是需要消耗IO性能的,所以我们在设计查询的时候最好能够避免这种回表查询。

概念:当能通过检索索引就可以读取想要的数据,那就不需要再到数据表中读取行了。如果一个索引包含了(或覆盖了)满足查询语句中字段与条件的数据就叫做覆盖索引,简单解释来说就是查询的正好是name字段的时候查询条件也使用的name,这样的话就无需回表查询,增加查询速度

显示效果:当发起一个被索引覆盖的查询(也叫索引覆盖查询)时,在EXPLAIN的Extra列可以看到“Using index”的信息。

索引下推

MySQL 5.6引入了索引下推优化,默认开启,使用以下命令可以将其关闭。

SET optimizer_switch = 'index_condition_pushdown=off';

官方文档中给的例子和解释如下:
people表中(zipcode,lastname,firstname)构成一个索引
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条件查询的情况下,减少回表次数。

索引的最左匹配原则

非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

索引使用原则

普通索引,唯一索引的选择

在普通索引和唯一索引的使用成本上,主要在于更新操作的时候,普通索引数据的更新,直接将数据更新到change buffer中,然后change buffer会定期的刷新到磁盘即可,而唯一索引需要去对比索引是否是唯一的,如果更新的数据在change buffer中,则对比的过程可以直接在内存中,这样时间成不不大,但是如果更新的数据不在change buffer中,那么更新就需要去IO磁盘进行查询对比,这样就会导致更新过程缓慢。所以如果业务上没有要求必须唯一的化,尽量使用普通索引,这样的成本会更低

上一篇下一篇

猜你喜欢

热点阅读