我遇到了使用复合主键的表的问题。 密钥由一个日期后跟一个bigint组成。
即使仅从PK中选择字段并使用包含两列的where子句,
在表上选择要扫描。例如
SELECT mydate, myid from foo WHERE mydate >='2014-08-26' AND my_id = 1234;
解释选择节目使用的位置和所考虑的行数以百万计。
一个奇怪的是key_len显示为7,看起来太小了。
我的直觉说钥匙坏了,但我可能会遗漏一些明显的东西。
有什么想法吗?
谢谢
理查德
答案 0 :(得分:1)
对于此查询,您想要的索引位于id, date
:
create index idx_foo_myid_mydate on foo(my_id, mydate);
这是因为where
子句中的条件具有相等性和不等式。在可以应用不等式之前,相等条件需要从左到右匹配索引。
MySQL documentation在解释复合索引方面确实做得很好(在我看来)。
您现有的索引将用于mydate
上的不平等。但是,然后将扫描所涉及日期之后的所有索引以满足my_id
上的条件。使用正确的索引,MySQL可以直接转到正确的行。