Mysql索引优化,是个绕不过去的话题,起码后端是绕不过去的。网上一搜一片,什么A,B,C的联合索引,A、B可查,A、C联合不可用,什么like不可用,什么like有些可用,有些不可用,有点懵啊,说的都是啥啊,记不住怎么办?
以下是InnoDB的一些小知识。
一、索引的划分
先说索引都分为什么?简单粗暴的划分,就是主键索引和非主键索引。这么叫不高端,那就是聚簇索引和非聚簇索引。聚簇索引就是主键索引。
二、索引的使用优化
主键索引组成的树里面都存的啥?是以主键为非叶子节点,按照大小排放的数据结构。叶子节点存的是全部数据。所以最好的查询就是根据主键来查询。
非主键组成的树存的是啥?存的是索引的数据以及主键值。同样按照大小排序。联合索引怎么办?按照最左原则,ABC联合索引,先A排序,A相同,按照B排序,B相同,按照C排序。所以得出如下结论:
1、查询根据最左原则,ABC索引,ABC、AB、A可以使用索引树,AC、BC、B、C不可以。
2、like 'str%'可以使用索引,like '%str' 和 '%str%' 不可用索引。
3、排序字段也可以参照最左原则,因为人家已经给你排好了。
4、查询的字段尽量在索引规定字段里面,这个叫做覆盖索引。
5、匹配范围。ABC索引,A的范围可以匹配。A全值(就是等于)B的范围可以匹配,但是不要A,直接B的范围是不可使用索引树的。
三、回表
上面说到,查询字段尽量在索引字段里面,超出范围怎么办?如果查询的数据量小,还是走索引,查到所需数据的ID,然后再从主键索引树中查找,速度还是很可观的。这个过程就是回表。
如果查询量很大,比如超出整体数据量的50%,那就不会走索引了,直接聚簇索引走起。
四、索引选取
索引很好,但是我们该怎么创建?一个表七个字段,创建八个索引,还不如不要索引。索引有时间和空间的损耗。
空间损耗是,每创建一个索引,都要一块空间来存储索引树。
时间损耗是,每一次增删改,都要维护所有的索引树同步。
那如何选取索引?
在查询条件中和排序条件中的字段可以创建索引。
索引查询出的数据量尽量小。一个表,有个性别字段,就男女俩值,就没必要创建索引了,一个条件,查出50%的数据,索引的节省的时间,都不够回表的,折腾那个干啥。如果有必要,那就创建联合索引。
索引的数据类型要小。表里面有个文章内容的字段,你拿这个去做索引,那一个非叶子节点里面可能只能存两条信息,完全没必要做索引了。
如果一定要上面的索引呢?可以使用字符串前缀做索引: KEY xxx (content(10)),content(10)是content字段前10个字符做索引。
补充一点,按照最左查询,需要在写sql的时候,按照最左写条件吗?不用,有优化器,自动帮你排序。但是如果到缓冲池层面,还是尽量按照最左来写,有个叫hash index的东西,自适应哈希索引,多次同样的条件访问,自动将你的查询条件存储到内存里,下次你查询直接走缓存。
就这样,小萌新,随便写一点东西自己看,求指点。
网友评论