在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引 。搜索的索引列,不一定是所要选择的列 。换句话说,最适合索引的列是出现在WHERE子句中的列,或连接子句中指定的列,而不是出现在SELECT关键字后的选择列表中的列 。使用短索引 。如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做 。例如,有一个CHAR(200)列,如果在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引 。对前10个或20个字符进行索引能够节省大量索引空间,也可能会使查询更快 。较小的索引涉及的磁盘 IO 较少,较短的值比较起来更快 。更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,MySQL 也可以在内存中容纳更多的值 。这样就增加了找到行而不用读取索引中较多块的可能性 。利用最左前缀 。在创建一个n列的索引时,实际是创建了MySQL可利用的n个索引 。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行 。这样的列集称为最左前缀 。对于InnoDB存储引擎的表,记录默认会按照一定的顺序保存,如果有明确定义的主键,则按照主键顺序保存 。如果没有主键,但是有唯一索引,那么就是按照唯一索引的顺序保存 。如果既没有主键又没有唯一索引,那么表中会自动生成一个内部列,按照这个列的顺序保存 。按照主键或者内部列进行的访问是最快的,所以InnoDB表尽量自己指定主键,当表中同时有几个列都是唯一的,都可以作为主键的时候,要选择最常作为访问条件的列作为主键,提高查询的效率 。另外,还需要注意,InnoDB 表的普通索引都会保存主键的键值,所以主键要尽可能选择较短的数据类型,可以有效地减少索引的磁盘占用,提高索引的缓存效果索引优化前置知识:联合索引的最左匹配原则在MySQL中,联合索引的最左匹配原则为:最左优先,以最左边的为起点任何连续的索引都能匹配上,同时遇到范围查询(>、<、between、like)就会停止匹配 。
如果在(a,b,c)三个字段上建立联合索引,那么它能够加快a|(a,b)|(a,b,c)三组的查询速度 。
注:这里限于篇幅,就对联合索引的最左匹配原则做一个简要的概括 。感兴趣可到MySQL学习(7)---最左匹配原则详解查看 。
覆盖索引覆盖索引指select的数据列仅从索引树中就能获得,不必读取数据行,不需要回表进行二次查询,也就是说,查询列要被所使用的索引覆盖 。
覆盖索引的优势:
- 避免了辅助索引对聚簇索引(在InnoDB引擎中对应主键索引)的二次查询 。
- 索引条目通常远小于数据行大小,只需要读取索引,则MySQL会极大地减少数据访问量 。
- 辅助索引不包含整行记录的所有信息,故其大小要远小于聚簇索引,因此可以减少大量的IO操作 。
注:覆盖索引技术最早是在InnoDB Plugin完成并实现 。这意味着对于InnoDB版本小于1.0的,或者MySQL数据库版本为5.0或以下的,InnoDB存储引擎不支持覆盖索引特性 。
Multi-Range Read(MRR)优化Multi-Range Read优化的目的就是为了减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问,这对于IO-bound类型的SQL查询语句可带来性能极大的提升 。Multi-Range Read优化可适用于range、ref、eq_ref类型的查询 。
Multi-Range Read的好处:
- MRR使数据访问变得较为顺序 。在查询辅助索引时,首先根据得到的查询结果,按照主键进行排序,并按照主键排序的顺序进行书签查找 。
经验总结扩展阅读
-
2022年10月24日是出火的黄道吉日吗 2022年农历九月廿九宜出火吗
-
-
-
-
-
亚麻衣服怎么洗不缩水,亚麻面料的衣服这样清洗不会缩水?
-
-
-
-
-
-
-
-
导语:心仪的他就在眼前 心仪的男人不唐突的4种搭讪方式,教你把握机会,迈出追爱第一步
-
-
再过4天,鸿运当头,高人一等,喜事接踵,横财不断,尽享富贵
-
-
六款2023年最佳手机推荐 手机好用排行榜2023
-
-
疾病 40岁是肠道疾病“高发期”,若想肠道更健康,3个坏习惯要改掉