一尘不染

为什么MySQL不使用任何这些可能的密钥?

mysql

我有以下查询:

SELECT t.id
FROM account_transaction t
JOIN transaction_code tc ON t.transaction_code_id = tc.id
JOIN account a ON t.account_number = a.account_number
GROUP BY tc.id

当我这样做时EXPLAIN,第一行显示的内容包括:

table: t
type: ALL
possible_keys: account_id,transaction_code_id,account_transaction_transaction_code_id,account_transaction_account_number
key: NULL
rows: 465663

为什么键为NULL?


阅读 279

收藏
2020-05-17

共1个答案

一尘不染

可能是因为统计信息已损坏,或者是因为它知道两个表之间始终具有1:1的比率。

您可以强制在查询中使用索引,并查看这样做是否可以加快速度。如果是这样,请尝试运行ANALYZE TABLE以确保统计信息是最新的。

通过指定USE INDEX(index_list),可以告诉MySQL仅使用命名索引之一来查找表中的行。备用语法IGNORE
INDEX(index_list)可用于告诉MySQL不要使用某些特定的一个或多个索引。如果EXPLAIN显示MySQL使用的索引可能不正确,则这些提示很有用。

您还可以使用FORCE INDEX,其作用与USE
INDEX(index_list)相似,但是要假定表扫描非常昂贵。换句话说,仅当无法使用给定索引之一在表中查找行时才使用表扫描。

每个提示都需要索引名称,而不是列名称。主键的名称为PRIMARY。若要查看表的索引名称,请使用SHOW INDEX。

http://dev.mysql.com/doc/refman/5.1/en/index-
hints.html

2020-05-17