【问题标题】:Mysql Order By Optimization with two indexesMysql Order By Optimization 有两个索引
【发布时间】:2014-08-26 20:25:30
【问题描述】:

我有下表:

名称:示例

Fields
Id: Int(10)
Quantity: Int(10)
ProductId: Int(10)
SaleTimestamp: Int(10)

Indexes
ID, Primary, Unique
ProductId, Not Unique
SaleTimestamp, Not Unique

如何优化以下查询?

SELECT Quantity FROM Example WHERE Product_id = 'x' ORDER BY SaleTimestamp DESC LIMIT 1

【问题讨论】:

  • 只需将 WHERE 子句中的 'x' 替换为整数
  • 为什么慢?它应该运行得很快。使用explain select ...查看发生了什么
  • 这张表是巨大的,它拥有超过一百万条记录。当我使用 EXPLAIN 时,我可以看到 Mysql 没有为 ORDER BY 子句使用 SaleTimeStamp 索引
  • 100 万行非常小,请参阅下面的回答,了解为什么只咨询一个 idx。
  • 感谢 kohjah,我会尝试添加组合索引,然后通知您

标签: php mysql sql optimization sql-order-by


【解决方案1】:

MySQL 只使用一个索引,所以为了查询它只会参考 ProductId 索引,因此 ORDER BY 不能使用索引。

解决办法是给两列加一个索引,例如

ALTER TABLE example ADD INDEX comb( ProductId, SaleTimestamp );

【讨论】:

  • 这很好。将quantity 添加到索引中会更加高效。
  • @GordonLinoff - 将quantity 添加到索引中如何有助于更好的搜索(真正有兴趣知道)?
  • 是的。我没有看到。作为补充说明,如果您在索引中有多个列,MySQL 只能在从左到右查询索引中的列时才能使用该索引。例如如果您索引列:a、b、c。您可以使用索引进行查询:SELECT a, b FROM tbl WHERE a = 1 and b = 2;但是,SELECT a, c FROM tbl WHERE a = 1 and c = 2;不会使用索引。
  • @TJ-。 . .然后该索引将成为查询的覆盖索引。是一个小优化,但是引擎只使用索引就可以满足查询,不必参考原始数据页。
  • 谢谢。这种优化(索引中的额外列)会影响插入/更新吗?
猜你喜欢
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 2012-03-27
  • 2021-07-09
相关资源
最近更新 更多