sql - Mysql索引被忽略

标签 sql mysql indexing primary-key key

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/

相关文章:

mysql - 如何添加索引,重用一些列?

c++ - SQLite3 C++ 查询靠近 "CASE": syntax error

mysql - SQL 仅选择列上具有最大值的行

sql - 如何在第三个查询中包含来自其他两个表的过滤行数?

php - 修复未索引的数据库 MySQL

indexing - Sybase 中的索引 View

java - 连接oracle数据库

mysql - 加入不重复

mysql - 在 MACOSX10.6 中加载 MySQLdb 模块时出错(Apache 和 mod_wsgi)

PHP 函数调用 MySQL