其他分享
首页 > 其他分享> > 索引案例思考

索引案例思考

作者:互联网

索引列顺序问题

索引列顺序意味着按照最左列进行排序
所以,索引可以按照升序或者降序进行扫描,以满足精确符合列顺序的ORDER BY GROUP BY DISTINCT。

通常,“将选择性最高的列放到索引最前列”

不考虑排序和分组时,这时候的索引只是用于优化where条件的查找。

案例

在线约会网站,用户信息有很多列,包括国家,地区,城市,性别等等

支持多种过滤条件

现在

需要看看哪些列拥有很多不同的取值哪些列WHERE子句中出现得最频繁。在有更多不同值的列上创建索引的选择性会更好。一般来说这样做都是对的,因为可以让MrySQL更有效地过滤掉不需要的行。

频繁:

county列的选择性通常不高,但可能很多查询都会用到。sex 列的选择性肯定很低,但也会在很多查询中用到。所以考虑到使用的频率,还是建议在创建不同组合索引的时候将(sex, country)列作为前缀。

根据传统的经验不是说不应该在选择性低的列上创建索引的吗?那为什么这里要将两个选择性都很低的字段作为索引的前缀列?我们的脑子坏了?

我们的脑子当然没坏。这么做有两个理由:第一点,如前所述几平所有的查询都会用到sex列。前面曾提到,几乎每一个查询都会用到sex列,甚至会把网站设计成每次都只能按某一种性别搜索用户。 更重要的一点是,索引中加上这一列也没有坏处,即使查询没有使用sex列也可以通过下面的“诀窍”绕过

这个“诀窍”就是:如果某个查询不限制性别,那么可以通过在查询条件中新增AND SEX IN('m','f') 来让MySQL选择该索引。这样写并不会过滤任何行,和没有这个条件时返回的结果相同。但是必须加上这个列的条件,MySQL才能够匹配索引的最左前缀。这个“诀窍”在这类场景中非常有效,但如果列有太多不同的值,就会让IN()列表太长,这样做就不行了。

这个案例显示了一个基本原则:考虑表上所有的选项。当设计索引时,不要只为现有的查询考虑需要哪些索引,还需要考虑对查询进行优化。如果发现某些查询需要创建新引,但是这个索引又会降低另一些查询的效率, 那么应该想一下 是否能优化原来的查询应该同时优化查询和索引以找到最佳的平衡,而不是闭广]造车去设计最完美的索引。

接下来

需要考虑其他常见WHERE条件的组合,并需要了解哪些组合在没有合适索引的情况下会很慢。(sex, country, age)上的索引就是一个 很明显的选择,另外很有可能还需要(sex, country, region, age)和(sex, country, region, city, age)这样的组合索引。这样就会需要大量的索引。

如果想尽可能重用索引而不是建立大量的组合索引,可以使用前面提到的IN()的技巧来避免同时需要(sex, country, age)和(sex, country,region, age)的索引。如果没有指定这个字段搜索,就需要定义一个全部国家的列表,或者国家的全部地区列表,来确保索引前缀有同样的约束(组合所有国家、地区、性别将会是一个非常大的条件)。

这些索引将满足大部分最常见的搜索查询,但是如何为一些生僻的搜索条件(比如has_pictures、eye_ color. hair_ color和education)来设计索引呢?这些列的选择性高、使用也不频繁,可以选择忽略它们,让MySQL多扫描一些额外的行即可。 另一个可选的方法是在age列的前面加上这些列,在查询时使用前面提到过的IN()技术来处理搜索时没有指定这些列的场景。

范围查询放最后:
你可能已经注意到了,我们一直将age列放在索引的最后面。age列有什么特殊的地方吗?为什么要放在索引的最后?我们总是尽可能让MySQL使用更多的索引列,因为查询只能使用索引的最左前缀,直到遇到第一个范围条件列。前面提到的列在WHERE子句中都是等于条件,但是age列则多半是范围查询(例如查找年龄在18 ~ 25岁之间的人)。

当然,也可以使用IN()来代替范围查询,例如年龄条件改写为IN(18,19, 20, 2122,23,24,25 ) 但不是所有的范围查询都可以转换。这里描述的基本原则是,尽可能将需要做范围查询的列放到索引的后面,以便优化器能使用尽可能多的索引列。

前面提到可以在索引中加人更多的列,并通过IN()的方式覆盖那些不在WHERE子句中的列。但这种技巧也不能滥用,否则可能会带来麻烦。因为每额外增加一一个 IN()条件,优化器需要做的组合都将以指数形式增加,最终可能会极大地降低查询性能。考虑下面的WHERE子句:

WHERE eye_color IN(‘brown’,‘blue’,‘hazel’)
AND hair_color IN(‘black’,‘red’,‘blonde’,‘crown’)
AND sex IN(‘M’,‘F’)
优化器会转换成4x3x2=24中组合。

标签:案例,age,查询,索引,选择性,思考,sex,WHERE
来源: https://blog.csdn.net/qq_37857224/article/details/116242211