暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL tips(三)——索引基础

爱可可的人生记录仪 2019-12-17
204

什么是索引?MySQL索引类似书本的目录页,是存储引擎快速找到记录的一种数据结构。索引的建立对于MySQL的高效运行是很重要的,索引大大减少了服务器需要扫描的数据量,可以帮助服务器避免排序和临时表,可以将随机I/O变为顺序I/O。索引缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。索引文件会占用磁盘空间。


常见索引模型:哈希表、有序数组、搜索树

哈希表:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置,性能极高。哈希冲突的处理办法:链表,where条件中带入哈希值和对应的列值;哈希表适用场景:只有等值查询的场景

有序数组:按顺序存储。查询用二分法就可以快速查询,时间复杂度是:O(log(N)),有序数组查询效率高,更新效率低。有序数组的适用场景:静态存储引擎。

二叉搜索树:每个节点的左儿子小于父节点,父节点又小于右儿子。查询时间复杂度O(log(N)),更新时间复杂度O(log(N))。数据库存储大多不适用二叉树,因为树高过高,会适用N叉树


InnoDB中的索引模型:B+Tree

索引类型:主键索引、非主键索引

主键索引的叶子节点存的是整行的数据(聚簇索引),非主键索引的叶子节点内容是主键的值(二级索引)

主键索引和普通索引的区别:主键索引只要搜索ID这个B+Tree即可拿到数据。普通索引先搜索索引拿到主键值,再到主键索引树搜索一次(回表)

一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。

从性能和存储空间方面考量,自增主键往往是更合理的选择。


部分索引策略

独立的列:索引列不能是表达式的一部分,也不能是函数的参数,否则mysql不会使用索引。

前缀索引:是一种能使索引更小、更快的有效办法,但使用后,mysql无法使用前缀索引做order和group by,也无法做覆盖扫描。

多列索引:多列索引的顺序至关重要,通常选择性高的列放在前面是比较好的。

聚簇索引:同时保存了索引和数据行,一个表只能有一个。

覆盖索引:如果一个索引包含或覆盖所需要查询的字段值,就称为覆盖索引。由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。


最左前缀原则:B+Tree这种索引结构,可以利用索引的"最左前缀"来定位记录。只要满足最左前缀,就可以利用索引来加速检索。最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符

联合索引安排字段顺序第一原则是:如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。然后考虑空间原则。

索引下推:在MySQL5.6之前,只能从根据最左前缀查询到ID开始一个个回表。到主键索引上找出数据行,再对比字段值。

MySQL5.6引入的索引下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。


参考资料:丁奇,MySQL实战45讲



部分内容来自网络,如有侵权请联系作者删除。




文章转载自爱可可的人生记录仪,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论