【问题标题】:mysql: multiple indexes advicemysql:多索引建议
【发布时间】:2017-11-01 18:39:03
【问题描述】:

我有一个表,我需要根据 4 列 a、b、c、d 进行查询 最常见的查询将是同时基于所有 4 列的选择,但是我需要能够快速搜索单独获取的每一列,或者它们的组合(例如 a&b、a&d、b&c&d 等)。 我应该为每个组合创建一个索引吗?或者最好只为 a&b&c&d 设置一个索引,为 a 设置一个索引,为 b 设置一个索引,为 c 设置一个索引,为 d 设置一个索引?在最后一种情况下,例如仅匹配 a&b 的查询将被加速,因为 a 和 be 都有索引?

【问题讨论】:

    标签: mysql performance select indexing insert


    【解决方案1】:

    如果你想用一个索引满足所有的组合,你需要以下:

    (a, b, c, d)
    (a, b, d)
    (a, c, d)
    (a, d)
    (b, c, d)
    (b, d)
    (c, d)
    d
    

    您不需要其他组合,因为索引的任何前缀也是索引。第一个索引将用于仅测试 aa&ba&b&c 的查询,因此您不需要这些组合的索引。

    您是否真的需要所有这些索引取决于您拥有多少数据。可能仅在每列上都有索引会充分缩小搜索范围,以至于您不需要组合索引。唯一真正的判断方法是对应用程序的性能进行基准测试。索引占用磁盘空间和内存,因此尝试创建所有可能的索引可能会导致其自身的问题;您需要确定需求是否足够强烈。

    【讨论】:

    • 现在不可能说这张桌子会有多大,但我可以猜到一张普通的桌子有 500k,最大的桌子有几百万。数据本身并不大,我有22列,9个十进制,一个是文本,其他是tinyint,索引会是tinyint。那么8个索引可能太多了?
    【解决方案2】:

    需要注意的是,“范围”仅作为索引中的最后一项有用:

    WHERE x=2 AND y>5   -- INDEX(x,y) is useful; INDEX(y,x) only uses `y`
    WHERE x=2 AND y BETWEEN 11 AND 22 -- ditto
    WHERE x=2 AND s LIKE 'foo%'  -- ditto
    

    另一件事:“标志”(真/假等)无法自行索引。它们结合起来会有些用处:

    WHERE published=1 AND ...
    

    另外,INDEX 中的顺序很重要,但WHERE 中的顺序很重要:假设您有INDEX(a,b)

    WHERE a=1 AND b=2 -- good index
    WHERE b=2 AND a=1 -- equally good
    WHERE a=1         -- the index is good
    WHERE b=2         -- the index is useless
    

    如果某些列始终是一个范围(例如日期),它会变得更加混乱。为了优化索引,这里需要两个索引:

    WHERE d BETWEEN ...  -- needs INDEX(d)
    WHERE a=1 AND d BETWEEN ...  -- needs INDEX(a,d)
    

    所以,我可能会这样做:

    • 将 a、b、c、d 的所有 2 列组合 -- 如果“范围”中不涉及任何内容,则这将是 6 个组合。我肯定会改变哪个 col 开始索引:ab、bc、cd、da、ac、db
    • 打开慢日志,看看哪些内容没有被很好地索引。
    • 记录人们使用的实际组合。一些组合很少使用。摆脱无用的索引。

    More 了解索引创建。

    【讨论】:

    • 我要索引的列是一种标志,其中三个存储简单的整数,一个可能是布尔值,因为我只有两个可能的值,你的意思是最后一列会变得没用因为这个索引?
    • @JamesBiffi - “最后一列没用” - 不。通过仅使用 2 列,我将索引数量保持在文明数字。要完成 4、24 个索引的所有组合 - 可能太多了。 Barmar 列出的 8 个工作假设所有测试都是 =,而不是范围,可能不是 INs
    • @JamesBiffi - 拥有实际的SHOW CREATE TABLE 可能会有所帮助,其中包含 4 列语义的线索。基于对问题集的理解,我们可能还可以玩其他“技巧”。示例:每当您测试b 时,您也会测试c
    • 感谢这两个答案都有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多