4

我正在尝试通过复合索引从具有 PRIMARY KEY (a, b) 的表中获取几条记录

SELECT * FROM table WHERE (a, b) IN ((1,2), (2,4), (1,3))

问题是,即使我使用 FORCE INDEX ( PRIMARY),MySQL 也没有使用索引。
EXPLAIN SELECT 显示 null possible_keys。

为什么没有可能的密钥?

通过复合键检索多行的最佳方法是什么:

  • 使用或
  • 使用 UNION ALL
  • 使用 WHERE () IN ((),())

PS 查询结果等于

SELECT * FROM table WHERE (a = 1 AND b = 2) OR (a = 2 AND b = 4) OR (a = 1 AND b = 3)

谢谢

4

3 回答 3

3

如果查询通过复合仅从索引中选择字段(或者如果表没有其他字段)WHERE ... IN,则将使用索引:

SELECT a,b FROM `table` WHERE (a, b) IN ((1,2), (2,4), (1,3))

否则将不会被使用。解决方法是使用派生查询:

SELECT t.* FROM (SELECT a, b FROM `table` WHERE (a, b) IN ((1,2), (2,4), (1,3))) AS o INNER JOIN `table` AS t ON (t.a = o.a AND t.b = o.b)

解释选择:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   PRIMARY <derived2>  ALL NULL    NULL    NULL    NULL    2   
1   PRIMARY t   eq_ref  PRIMARY PRIMARY 2   o.a,o.b 1   
2   DERIVED table   index   NULL    PRIMARY 2   NULL    6   Using where; Using index
于 2012-03-07T07:20:36.963 回答
0

尝试在 a、b 列上创建组合索引。

索引不需要是主键,它仍然可以提供很大帮助。

有关您的问题的更多信息:http: //dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

于 2012-03-06T12:51:41.503 回答
0

In strong desire of indexing a certain column, have you considered having a new column: a_b which is basicly CONCAT(a, '-', b) and just compare that (WHERE a_b = {$id1}-{$id2})?

And you can only have one PRIMARY column per table. You can't "index primary" both a and b

于 2012-03-06T10:37:07.440 回答