我的表格包含以下字段:id
,sex
,age_min
,age_max
,url
。
该表格将按性别,年龄范围和身份进行过滤。常见的查询是:
SELECT `url` FROM foo WHERE (`id` NOT BETWEEN %lim_1% AND %lim_2%)
AND `sex`=%sex%
AND `age_min` <= %age% AND `age_max` >= %age%
我的问题是:我应该设置哪些索引以便优化查询响应时间?此外,如果查询本身可以某种方式进行优化,我也想知道。
答案 0 :(得分:2)
这种查询难以用索引加速; age_min <= %age% AND age_max >= %age%
过滤不能由查询规划器或程序员重构为整齐的小索引范围扫描。
所以,你应该创建一个覆盖索引并希望最好。
您在sex = %sex%
上有一个相等过滤器,因此该列应该引导索引。
您在age_min
和age_max
上拥有半扫描范围过滤器。如果知道其中一个比另一个更具选择性,请选择它作为索引中的下一列。否则只需选择其中一个。
然后,在索引中包含表格的其余部分。所以你会得到
(sex, age_min, age_max, id, url)
在索引中。查询计划程序只能扫描此索引的一部分,然后从索引中满足查询。如果您查找覆盖索引,您可以了解有关此技术的更多信息。
注意即可。如果您未在过滤器中包含sex = %sex%
子句,则此索引对于满足该查询变得毫无价值。
注意即可。 MySQL几乎不会使用多个索引来满足单个WHERE
子句。因此,将单列索引放在很多列上几乎不是一个好主意。
注意即可。如果表格中包含的行少于几百行,那么将其编入索引可能会造成伤害,但可能不会有太多帮助。