EXPLAIN SELECT
*
FROM
content_link link
STRAIGHT_JOIN
content
ON
link.content_id = content.id
WHERE
link.content_id = 1
LIMIT 10;
+----+-------------+---------+-------+---------------+------------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+------------+---------+-------+------+-------+
| 1 | SIMPLE | link | ref | content_id | content_id | 4 | const | 1 | |
| 1 | SIMPLE | content | const | PRIMARY | PRIMARY | 4 | const | 1 | |
+----+-------------+---------+-------+---------------+------------+---------+-------+------+-------+
但是,当我删除 WHERE 时,查询将停止使用该键(即使我明确强制它这样做)
EXPLAIN SELECT
*
FROM
content_link link FORCE KEY (content_id)
STRAIGHT_JOIN
content
ON
link.content_id = content.id
LIMIT 10;
+----+-------------+---------+--------+---------------+---------+---------+------------------------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+--------+---------------+---------+---------+------------------------+---------+-------------+
| 1 | SIMPLE | link | index | content_id | PRIMARY | 7 | NULL | 4555299 | Using index |
| 1 | SIMPLE | content | eq_ref | PRIMARY | PRIMARY | 4 | ft_dir.link.content_id | 1 | |
+----+-------------+---------+--------+---------------+---------+---------+------------------------+---------+-------------+
是否有任何解决方法?
我意识到我在第二个例子中选择了整个表,但为什么 mysql 突然决定它无论如何都会忽略我的 FORCE 并且不使用 key ?如果没有 key ,查询大约需要 10 分钟......呃。
最佳答案
FORCE 有点用词不当。这是 MySQL 文档所说的(强调我的):
您还可以使用 FORCE INDEX,它的作用类似于 USE INDEX (index_list),但另外假设表扫描的开销非常大。换句话说,仅当无法使用给定索引之一来查找表中的行时才使用表扫描。
因为您实际上并没有“找到”任何行(您正在选择所有行),所以表扫描总是将是最快的,而且优化器足够聪明,知道尽管如此您告诉他们的内容。
预计到达时间:
尝试在主键上添加一次 ORDER BY,我敢打赌它会使用索引。
关于sql - Mysql索引被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/945925/