如何使用范围索引表?

时间:2016-08-17 12:00:41

标签: mysql indexing query-performance

我的表格包含以下字段:idsexage_minage_maxurl

该表格将按性别,年龄范围和身份进行过滤。常见的查询是:

SELECT `url` FROM foo WHERE (`id` NOT BETWEEN %lim_1% AND %lim_2%) 
AND `sex`=%sex% 
AND `age_min` <= %age% AND `age_max` >= %age%

我的问题是:我应该设置哪些索引以便优化查询响应时间?此外,如果查询本身可以某种方式进行优化,我也想知道。

1 个答案:

答案 0 :(得分:2)

这种查询难以用索引加速; age_min <= %age% AND age_max >= %age%过滤不能由查询规划器或程序员重构为整齐的小索引范围扫描。

所以,你应该创建一个覆盖索引并希望最好。

您在sex = %sex%上有一个相等过滤器,因此该列应该引导索引。

您在age_minage_max上拥有半扫描范围过滤器。如果知道其中一个比另一个更具选择性,请选择它作为索引中的下一列。否则只需选择其中一个。

然后,在索引中包含表格的其余部分。所以你会得到

 (sex, age_min, age_max, id, url)

在索引中。查询计划程序只能扫描此索引的一部分,然后从索引中满足查询。如果您查找覆盖索引,您可以了解有关此技术的更多信息。

注意即可。如果您未在过滤器中包含sex = %sex%子句,则此索引对于满足该查询变得毫无价值。

注意即可。 MySQL几乎不会使用多个索引来满足单个WHERE子句。因此,将单列索引放在很多列上几乎不是一个好主意。

注意即可。如果表格中包含的行少于几百行,那么将其编入索引可能会造成伤害,但可能不会有太多帮助。