MySQL LEFT JOIN缓慢,没有使用索引

时间:2013-12-19 18:10:19

标签: mysql indexing left-join

所以我们在两个数据库中有两个表,db1table1,以及db2table2。但是,尝试对它们执行LEFT JOIN需要花费三分钟时间。疯了,我知道。

SELECT * FROM `db1`.`table1` AS a LEFT JOIN `db2`.`table2` AS b ON a.col=b.col

a大约有14,000行。 b约为825,000行。

我们已将cola b编入索引。在这两种情况下,col都是VARCHAR(16)并且latin1_swedish_ci整理。

运行解释

EXPLAIN SELECT * FROM `db1`.`table1` AS a LEFT JOIN `db2`.`table2` AS b ON a.col=b.col

向我们表明,两个表都没有使用索引。我认为这就是性能如此糟糕的原因。

1   SIMPLE  a   ALL NULL    NULL    NULL    NULL    14174   
1   SIMPLE  b   ALL NULL    NULL    NULL    NULL    824687  

但是,我不明白为什么正在发生这种情况或如何解决它。将b与其他更大的表连接起来可以在几秒钟内完成,并且可以正确使用索引。在这种情况下发生了什么,我应采取哪些步骤来纠正它?

1 个答案:

答案 0 :(得分:1)

您正在选择每个表格中的每一列。 Varchar字段对于索引与主键索引相反是低效的。你的索引应该在你加入的字段上,否则它们是无用的,除了搜索效率。

SELECT col, col4, col5, col6 FROM `db1`.`table1` AS a LEFT JOIN (SELECT col,col1, col2, col3 from `db2`.`table2` order by 1,2,3) AS b ON a.col=b.col

如果您加入子查询,您将只提取所需的列,这将大大加快性能,并在子查询结束时创建一个包含1,2,3的订单的索引

您还必须在子查询中包含您将加入的字段...

<强> ANSWER

为查询使用索引是没有意义的,因为您选择的是全文列。这意味着MySQL不能单独使用索引来满足查询。