【问题标题】:Issue with MySQL Compound Primary KeyMySQL 复合主键的问题
【发布时间】:2014-08-27 11:09:56
【问题描述】:

我对使用复合主键的表有疑问。 密钥由一个日期和一个 bigint 组成。

即使仅从 PK 中选择字段并使用包含两列的 where 子句,表上的选择看起来也正在扫描。例如

SELECT mydate, myid from foo WHERE mydate >='2014-08-26' AND my_id = 1234;

解释使用位置和考虑的行数以百万计的选择节目。

一个奇怪的地方是 key_len,它显示为 7,看起来太小了。

我的直觉说钥匙坏了,但我可能遗漏了一些明显的东西。

有什么想法吗?

谢谢

理查德

【问题讨论】:

  • percona 集群上的 MySQL 5.5。
  • 请发布show create table foo;explain select...的结果;

标签: mysql optimization compound-key


【解决方案1】:

对于这个查询,你想要的索引在id, date:

 create index idx_foo_myid_mydate on foo(my_id, mydate);

这是因为where子句中的条件有相等和不等。等式条件需要从左到右匹配索引,然后才能应用不等式。

MySQL documentation 实际上在解释复合索引方面做得很好(在我看来)。

您现有的索引将用于mydate 上的不等式。但是,将扫描相关日期之后的所有索引以满足my_id 的条件。有了正确的索引,MySQL 就可以直接找到正确的行。

【讨论】:

  • 谢谢你哦,添加和索引到 66M 行的乐趣 :)
猜你喜欢
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2013-03-05
  • 2011-07-28
  • 1970-01-01
  • 2011-08-01
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多