我有以下查询:
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,第一行显示的内容包括:
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?
可能是因为统计信息已损坏,或者是因为它知道两个表之间始终具有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。
通过指定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