SELECT语句不使用possible_keys

时间:2011-03-31 17:22:12

标签: mysql select indexing explain

我有遗留系统中没有主键的表。它记录了在工厂发布材料的交易数据。

为简单起见,我们可以说每行包含job_number,part_number,quantity& date_issued。

我在发布日期列中添加了一个索引。当我运行EXPLAIN SELECT * FROM issued_pa​​rts WHERE date_issued> '20100101',它显示了这个:

+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+
| id | select_type | table          | type | possible_keys     | key  | key_len | ref  | rows    | Extra       |
+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | issued_parts   | ALL  | date_issued_alloc | NULL | NULL    | NULL | 9724620 | Using where |
+----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+

所以它看到了键,但它没有使用它? 有人可以解释原因吗?

3 个答案:

答案 0 :(得分:9)

有些东西告诉我MySQL Query Optimizer正确决定了。

这是你怎么说的。运行这些:

行数

SELECT COUNT(1) FROM issued_parts;

匹配查询的行数

SELECT COUNT(1) FROM issued_parts WHERE date_issued > '20100101';

如果您实际检索的行数超过表总数的5%,则MySQL查询优化器会决定进行全表扫描的工作量会减少。

现在,如果您的查询更精确,例如,使用以下内容:

SELECT * FROM issued_parts WHERE date_issued = '20100101';

然后,您将完全获得一个不同的EXPLAIN计划。

答案 1 :(得分:0)

possible_keys使用相关列命名键,但这并不意味着其中的每个键对查询都有用。在这种情况下,没有。

答案 2 :(得分:0)

索引有多种类型(索引?)。哈希索引是对给定特定值的项进行查找的快速方法。如果你有一堆你要查询的谨慎值(例如,10个日期的列表),那么你可以为每个值计算一个哈希值,并在索引中查找它们。由于您没有对特定值进行查找,而是进行比较,因此哈希索引对您没有帮助。

另一方面,B-Tree索引可以帮助您,因为它为它正在编制索引的元素提供了排序。例如,请参见此处:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html for mysql(搜索B-Tree索引特征)。您可能想要检查您的表是否正在为其索引列使用b-tree索引。