MySQL正在以错误的顺序搜索表。
我有这个
SELECT *
FROM trx
inner join mst on (mst.pk = trx.fk)
WHERE trx.locid = 'xx'
此查询很长,因为MySQL在使用mst
进行交叉引用之前首先搜索表trx
,而不是相反。
During EXPLAIN, the result is
SIMPLE mst
SIMPLE trx
(in that order)
I need this
SIMPLE trx
SIMPLE mst
(trx first, before mst)
这很奇怪,因为我的所有其他SQL语句都做得很好,除了这个。
我们可以告诉MySQL先过滤哪个表,然后再引用另一个表吗?
谢谢!
答案 0 :(得分:0)
为什么MySQL在mst
之前扫描trx
的原因有一个可能的解释,尽管这两个表在查询中以相反的顺序出现,但表的顺序与{{INNER JOIN
无关。 1}}。无论出于何种原因,查询优化器必须认为以这种方式加入会更快。
MySQL中的主键列是MyISAM和InnoDB的隐式索引。所以我不认为mst.pk
列是一个问题。但trx.fk
列可能会从索引中受益。要测试此假设,您可以在该列上添加索引,如果您还没有这样做:
ALTER TABLE trx ADD INDEX `fk_idx` (fk)
如果两个连接列都已编入索引,则连接顺序不会有太大差异,希望您能获得所需的性能。
答案 1 :(得分:0)
感谢您的帮助。
在这种情况下发现USE INDEX
有帮助。
SELECT *
FROM trx USE INDEX(index_name)
inner join mst USE INDEX(PRIMARY) on (mst.pk = trx.fk)
WHERE trx.locid = 'xx'