gpt4 book ai didi

mysql - 如何索引具有范围的表?

转载 作者:行者123 更新时间:2023-11-29 06:09:48 25 4
gpt4 key购买 nike

我有一个包含以下字段的表:idsexage_minage_max网址

该表将按性别、年龄范围和 ID 进行过滤。一个常见的查询是:

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

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

最佳答案

这种查询很难通过索引显着加速; age_min <= %age% AND age_max >= %age%查询规划器或程序员无法将过滤重构为简洁的小型索引范围扫描。

因此,您应该创建一个覆盖索引并希望获得最好的结果。

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

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

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

 (sex, age_min, age_max, id, url)

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

注意。如果您不包括 sex = %sex%过滤器中的子句,该索引对于满足该查询变得毫无值(value)。

注意。 MySQL 几乎从不使用多个索引来满足单个 WHERE条款。因此,将单列索引放在很多列上几乎不是一个好主意。

注意。如果表包含的行数少于几百行,对其编制索引不会有什么坏处,但可能不会有太大帮助。

关于mysql - 如何索引具有范围的表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38996059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com