MySQL优化:索引选择WHERE vs JOIN

时间:2016-04-05 19:27:51

标签: mysql indexing query-optimization

我有一个特定的查询,我想在主表tableA的一部分(特定日期)LEFT JOIN:

SELECT *
FROM (SELECT * FROM `tableA` WHERE date='2016-04-04') a 
LEFT JOIN tableB b 
ON a.columnA= b.columnB

一些表统计信息:

tableA: ~1m rows
tableA where date='2016-04-04': 46k rows
tableB: 62k rows

使用的最佳索引是什么?

3 个答案:

答案 0 :(得分:0)

以下是我的实验和结果:

无索引

Query took 130.0157 seconds.

WHERE变量的索引(TableA中的日期)

Query took 111.722 seconds.

JOIN变量的索引(TableA中的columnA和TableB中的columnB)

Query took 10.578 seconds.

JOIN和WHERE变量的索引(columnA上的一个索引,TableA中的另一个日期和TableB中的columnB)

Query took 8.327 seconds.

这种情况的最佳选择:

columnA index and columnB index will be used in JOIN key to improve **a lot**
date index will be used in WHERE key to improve **a bit**

答案 1 :(得分:0)

可能更好的是TableA上的一个复合索引

 (date, columnA)

TableB上的索引

(columnB) 

答案 2 :(得分:0)

function areaSelection(){ $("map").on('click', 'area', function (e){ e.preventDefault(); var areaSelect = parseInt(this.id); console.log(areaSelect); }); } var mapSelection = areaSelection(); $("area").on('click', areaSelection); 替换为您实际需要的列表可能会有所帮助。如果您不需要*列,这将特别有用。

如果您不需要TEXT,请摆脱它。这样,优化器可以选择从tableB开始。目前,该选项可能被禁止。

LEFT

tableA: INDEX(date) tableB: INDEX(columnB) 不会有任何帮助,因为查询只适用于所有(date, columnA)

仅当*被删除时,

(columnA)才有用。注意:"嵌套循环加入"这种或那种方式。也就是说,你需要第二个表的索引;在LEFT的另一侧有相应的索引是没用的。

你有两次运行时间吗?第一次填充缓存;第二次会保存I / O.只考虑第二个。

提供JOIN进一步讨论。