我有遗留系统中没有主键的表。它记录了在工厂发布材料的交易数据。
为简单起见,我们可以说每行包含job_number,part_number,quantity& date_issued。
我在发布日期列中添加了一个索引。当我运行EXPLAIN SELECT * FROM issued_parts 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 | +----+-------------+----------------+------+-------------------+------+---------+------+---------+-------------+
所以它看到了键,但它没有使用它? 有人可以解释原因吗?
答案 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索引。