如何告诉MySQL首先搜索哪个表

时间:2017-03-23 04:51:52

标签: mysql

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先过滤哪个表,然后再引用另一个表吗?

谢谢!

2 个答案:

答案 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'