【有书共读】《高性能MySQL》第二期《创建高性能索引》

上期地址:https://www.nowcoder.com/discuss/85234  【有书共读】《高性能MySQL》第一期《架构与历史》

这是第二次笔记,索引这块真的是每次面试必考。文中如有不对,请私信或者留言讨论,谢谢!

索引类型(在mysql中索引是在存储引擎层实现的,所以不同的存储引擎的索引的工作方式也不一样。):

B+Tree

                                                                                          (图片来自网络,该图是聚集索引图,非聚集索引的话,叶子节点不存数据,而是"指针”)
当人们谈论索引的时候,如果没有特别指明索引类型,多半说的是B+Tree索引。例如,MyISAM使用前缀压缩技术使得索引更小,但InnoDB则按照原数据格式进行存储。再如MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据引用被索引的行。其次B+Tree通常一位着所有的值都是按顺序存储的,所以很适合查找范围数据。B+Tree索引适用于全键值,键值范围或键前缀查询,其中键前缀查找只适用于根据最左前缀的查找。
B+Tree索引的限制:
1.如果不是按照索引的最左列开始查找,则无法使用索引(组合索引(A,B,C),不能单独查B或者C)
2.不能跳过索引的列(组合索引(A,B,C),不能查A,C,不然只能使用部分索引)
3.如果查询中有某个列的范围查询,则其邮编所有列都无法使用索引(组合索引(A,B,C),where a=? and b>( like..between等等范围查询) and c=?,这样的查询会使c无法使用索引)


哈希索引
哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码,哈希码是一个较小的值,哈希索引将所有额哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。在Mysql中只有Memory引擎显式支持哈希索引。
哈希索引限制:
1.哈希索引无序的,所以不能用来排序
2.哈希索引不支持部分索引列匹配查找,例如在数据列(A,B)上建立哈希索引,如果查询只有数据列A,则无法使用索引
3.哈希索只支持等值比较,不支持范围查询
4.哈希冲突会限制哈希索引的效率
InnoDB引擎有一个特殊功能叫做“自适应哈希索引”。当innodb引擎注意到某些索引值被频繁的使用时,它会在B+Tree索引之上再创建一个哈希索引,这样就让B+Tree索引也具有哈希索引的一些优点,比如快速的哈希查找。这是一个完全自动,内部的行为,用户无法配置和控制,不过可以关闭该功能。

空间数据索引
空间索引会引用所有维度来索引数据

全文索引
全文索引是一种特殊的索引类型,它查找的是文本中的关键词,而不是比较索引中的值。

总结索引优点:
1.索引大大减少了服务器需要扫描的数据量
2.索引可以帮助服务器避免排序和临时表
3.索引可以将随机I/O变成顺序I/O。

高性能索引策略:
1.独立的列,即索引不能是表达式或者函数的一部分,例如下面的查询不会使用索引
select * from xxxtable where id+1=5;
2.前缀索引,有时候需要建立索引的列是个很长的字符串,通常可以索引开始的部分字符,节约索引空间,提高索引效率。
3.多列索引
4.覆盖索引
5.使用聚簇索引(非聚簇索引可能会回表做二次查询)
6.使用索引扫描来做排序
#MySQL#
全部评论
使用聚簇索引才会导致二次回表查询吧,因为辅助索引的data域存的是相应记录主键的值。
点赞 回复 分享
发布于 2018-07-24 16:01
innodb使用聚簇索引的辅助索引会导致2次查询吧,直接使用以主键作为索引的聚簇索引不会2次查询。myisam非聚簇索引的主键索引和辅助索引都是一样的存地址,所以不会2次查询。我的理解是这样的。
点赞 回复 分享
发布于 2018-07-24 17:00
点赞 回复 分享
发布于 2018-07-20 13:19
点赞 回复 分享
发布于 2018-07-24 16:37

相关推荐

10-13 17:47
门头沟学院 Java
wulala.god:图一那个善我面过,老板网上找的题库面的
点赞 评论 收藏
分享
粗心的雪碧不放弃:纯学历问题,我这几个月也是一直优化自己的简历,后来发现优化到我自己都觉得牛逼的时候,发现面试数量也没有提升,真就纯学历问题
点赞 评论 收藏
分享
1 17 评论
分享
牛客网
牛客企业服务