如何优化此查询?

时间:2009-10-22 14:32:11

标签: sql mysql query-optimization

查询:

select id,
       title 
  from posts 
 where id in (23,24,60,19,21,32,43,49,9,11,17,34,37,39,46,5
2,55)

解释计划:

mysql> explain select id,title from posts where id in (23,24,60,19,21,32,43,49,9,11,17,34,37,39,46,5
2,55);
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | posts | ALL  | PRIMARY       | NULL | NULL    | NULL |   30 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.05 sec)

id是posts表的主键。

2 个答案:

答案 0 :(得分:3)

除了添加其他索引,例如

  • 聚集索引ID
  • 覆盖索引,包括id [first]和SELECT子句中的其他列

似乎没什么可做的......

事实上,即使有可用的索引, MySQL也可能决定进行表扫描,就像这里的情况一样(“ALL”类型)。原因可能是表可能具有相对较少的行(与查询将返回的估计行数相比),因此更有效地“读取”表,顺序地,丢弃非我们去的时候匹配行,而不是“希望遍布整个地方”,带有索引间接。

答案 1 :(得分:0)

我认为没有任何问题。如果您需要选择列表,那么“IN”是正确的方法。你没有选择不必要的信息,你选择的东西是一个关键,可能是索引。