10

我有一个来自遗留系统的表,它没有主键。它记录了工厂发放材料的交易数据。

为简单起见,假设每行包含 job_number、part_number、quantity 和 date_issued。

我在发布日期列中添加了索引。当我运行 EXPLAIN SELECT * FROM issue_parts WHERE date_issued > '20100101' 时,它显示如下:

+----+-------------+----------------+------+------ ----------+------+---------+------+---------+-- ------------+
| 编号 | 选择类型 | 表| 类型 | 可能的键 | 关键 | key_len | 参考 | 行 | 额外 |
+----+-------------+----------------+------+------ ----------+------+---------+------+---------+-- ------------+
| 1 | 简单 | 已发行零件 | 全部 | date_issued_alloc | 空 | 空 | 空 | 9724620 | 使用位置 |
+----+-------------+----------------+------+------ ----------+------+---------+------+---------+-- ------------+

所以它看到了密钥,但它不使用它?有人可以解释为什么吗?

4

3 回答 3

10

有些东西告诉我 MySQL 查询优化器的决定是正确的。

这是您可以分辨的方法。运行这些:

行数

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 计划。

于 2011-03-31T18:33:32.310 回答
0

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

于 2011-03-31T18:44:25.517 回答
0

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

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

于 2011-03-31T18:56:12.207 回答