5 创建高性能的索引

2019-12-22  本文已影响0人  ysdyyy

一:索引基础
在MySQL中,索引是在引擎层实现的,所以并没有统一标准,各引擎中索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。
1:索引的类型:
1.1 B-Tree索引
优点:
B-Tree索引适用于全键值,键值范围或键前缀查找,其中键前缀查找只适用于最左前缀的查找。
因为索引树的节点是有序的,所以除了按值查找外,索引还可以用于按顺序查找(order by)
限制:
索引顺序会影响查找性能,如果不是按照索引的最左列开始查找,则无法使用索引。
1.2 哈希索引
基于哈希表,哈希索引的数据结构:
槽为哈希值,值为指向数据行的指针
槽的编号是顺序的
1.3 空间数据索引
空间索引无需前缀查询,会从所有维度来索引数据
1.4 全文索引
它查找的是文本中的关键词,而不是直接比较索引中的值。更类似于搜索引擎做的事情。
1.5 其他索引类别
tokuDB使用分形树索引,innodb中聚簇索引,覆盖索引等。
2:索引的优点
2.1大大减少了服务器需要扫描的数据量
2.2索引可以帮助服务器避免排序和临时表
2.3索引可以将随机i/o变为顺序i/o
Tapio Lahdenmaki和Mike Leach编写的Relational Database Index Design and the Optimizeres,该书详细介绍了如何计算索引的成本和左营,如何评估查询速度,如何分析索引维护的代价和其带来的好处等。
3:高性能的索引策略
3.1 独立的列(索引不能是表达式的一部分,也不是函数的参数)
3.2 前缀索引和索引选择性
前缀索引:索引开始的部分字符
索引选择性:不重复的索引数/记录总数
3.3 多列索引
当出现服务器对多个索引做相交操作时(通常有多个and条件),通常意味着需要一个包含所有相关列的多列索引,而不是多个独立的单列索引。
当服务器需要对多个索引做联合操作时(通常有多个or条件),通常需要耗费大量的CPU和内存资源在算法的缓存、排序和合并操作上。特别是当其中有些索引的选择性不高,需要合并扫描返回的大量数据的时候。
更重要的是,优化器只关心随机页面读取,不会把这些计算到查询成本中,这会导致查询的成本被低估。
3.4 选择合适的索引列顺序
如何选择索引的列顺序有一个经验法则:将选择性最高的列放到索引最前列。能有话where条件的查找。
3.5 聚簇索引
当表有聚簇索引时,它的数据行实际存放在索引的叶子夜中。“聚簇”表示数据行和相邻的键值紧凑的存储在一起。
因为无法同时将数据航存放在两个不同的地方,所以一个表中只能有一个聚簇索引。
3.6 覆盖索引
如果一个索引包含所有需要查询的字段的值,我们称它为“覆盖索引”
3.7 使用索引扫描来做排序
3.8 压缩(前缀压缩)索引
完全保存索引块的第二个值,然后其他值同第一个值比较得到相同的前缀的字节数和剩余的不同后缀部分,奔着部分保存
perform performance=>7,ance
压缩块使用更少的空间,但无法使用二分查找智能从头开始扫描
3.9 冗余和重复索引
3.10 未使用的索引删掉
3.11 索引和锁

重点:
在选择索引和编写利用这些索引的查询时,有三个原则:
单行访问时很慢的,尽量选择合适的索引。
按顺序访问范围数据是很快的,尽可能使用数据原生顺序从而避免额外的排序操作。
索引覆盖查询是很快的。

上一篇下一篇

猜你喜欢

热点阅读