关于索引三星评估法的一点思考

想写这篇文章,是因为在了解MySQL索引的three-star System三星系统过程中,想试着写一篇博客表达自己的理解

在《High Performance MySQL (3rd Edition)》英文第三版的原文是:

Lahdenmaki and Leach’s book also introduces a three-star system for grading how suitable an index is for a query.
The index earns one star if it places relevant rows adjacent to each other,
a second star if its rows are sorted in the order the query needs,
and a final star if it contains all the columns needed for the query.

中文翻译为:

索引将相关的记录放到一起获得一星;
如果索引中的数据顺序和查找中的排列顺序一致获得两星;
如果索引中的列包含了查询中需要的全部列则获得三星;

在一篇浏览量比较多的博客中,博主的个人观点是:

评估一个索引是否适合某个查询的“三星系统”(three-start system):
一星:索引将相关的列放到一起,即在一系必要的列上建立索引,不必为在where条件里面的列都建立索引。
二星:索引中的数据列顺序和查找中排列顺序一致。通常将选择性最高的列放到索引的最前列。
三星:索引中的列包含了查询中需要的全部列。索引包含查询所需要的数据列,不再进行全表查表(聚簇索引、覆盖索引)

对于这些论述,感觉有些理解上的不同:
1.第一颗星的那个英文语句,rows 应该是指索引表中的,这一点如果理解成相关记录可能会带来理解上的偏差,我对于这一句话的理解是:如果索引能够把索引表中和数据相关的行相互毗邻存储,那么这个索引就可以获得一颗星。
在索引的基础上查找数据,如果这些索引中的行所存储的内存区域比较集中,这样就可以减少IO复杂度,从而带来性能的提升。关于这一点,在选择索引的标识符的时候,应该尽量选择整型,消耗空间较小,可以更快的处理,存储相对集中;对于字符串类型的标识符,更消耗空间,处理起来比较慢,存储位置更加分散,这会导致页面分裂、随机访问磁盘,性能较差
2.第二颗星的英文语句,我对于这句话的理解是:如果一个索引中行的排序方式和查询所需要的排序方式一致,那么这个索引就可以获得第二颗星
MySQL中组合索引是依赖最左边的索引进行有效的查找,如果最左边的索引不是where条件语句的第一个过滤条件,那么MySQL将不采用索引查询方式,而采用全表查找;如果最左边的索引列包含在where条件语句的第一个过滤条件,但是如果第二个索引和第三个索引位置颠倒,那么如果处于前面位置的第三个索引采用了范围查找,就不能使用最后的第二个索引进行查找,所以索引表行中列的合适顺序可以提高查询语句的性能
3.我对于第三个语句的理解是一致的,索引中包含查询所需要的全部列(>=),那么在查询时就可以直接以对数的时间范围进行快速查询,性能会得到数量级上的提升,所带来的负面影响就是更新索引带来增删改操作耗时会有所增加


版权声明:本文为tj666666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>