【问题标题】:MySQL and index on sumMySQL和总和索引
【发布时间】:2012-11-07 12:33:34
【问题描述】:

我有一张包含一些数据的表格。为简单起见,它看起来像:

id - auto_increment
c1 - int
c2 - int
created - date

可能有很多数据

我获取数据的方式是这样的:

SELECT * FROM my_table WHERE created >= DATE_SUB(NOW(), INTERVAL 1 HOUR) ORDER by c1 + c2 DESC LIMIT 10

如何为 c1 + c2 制作索引?可能吗?我应该添加它,我的意思是它会减慢查询速度吗?

【问题讨论】:

  • 您要按 c1 和 c2 列的总和排序,还是要按两列排序?
  • @bonCodio,我想要这些列的总和
  • @Dave,你是什么意思?
  • @arthur.borisow - 你只接受了 35% 的问题答案。这通常表明您不在乎或不遵守。您应该接受您过去提出的问题的正确答案,以提高您的“接受率”。

标签: mysql performance indexing


【解决方案1】:

唯一有用的索引

SELECT *            -- I assume many fields here
    FROM my_table
    WHERE created >= DATE_SUB(NOW(), INTERVAL 1 HOUR) -- useful
    ORDER by c1 + c2 DESC   -- expressions cannot be indexed
    LIMIT 10         -- does not matter

INDEX(created)

有关创建最佳索引的更多讨论,请参阅我的index cookbook

热销:5.7 可以创建和索引物化虚拟列,例如(c1+c2)。因此,以该 col 开头并以 created 结尾的复合索引可能在 5.7 中会更好。

【讨论】:

    【解决方案2】:

    您可以只创建一个包含两个字段的索引。 比如:

    ALTER TABLE my_table ADD INDEX sumC1C2 (c1,c2)
    

    【讨论】:

    • 我不明白否定的意思。如果您对两者都有索引,则获取值会更快,并且性能问题也会更少。
    • 不是我投反对票,但我怀疑该指数不会产生太大(积极)影响。查询可以在created 上过滤以过滤行数,但随后必须逐行从索引中选择值以进行总和(索引不在总和上,而是在部分上) ,很可能不会比直接从桌子上做起来快。
    猜你喜欢
    • 2010-10-01
    • 2012-07-03
    • 2019-04-21
    • 2010-11-18
    • 1970-01-01
    • 2011-06-29
    • 2020-06-04
    • 2023-03-27
    • 2020-06-27
    相关资源
    最近更新 更多