所以我们在两个数据库中有两个表,db1
和table1
,以及db2
和table2
。但是,尝试对它们执行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行。
我们已将col
和a
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
与其他更大的表连接起来可以在几秒钟内完成,并且可以正确使用索引。在这种情况下发生了什么,我应采取哪些步骤来纠正它?
答案 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不能单独使用索引来满足查询。