我有一个特定的查询,我想在主表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
使用的最佳索引是什么?
答案 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
进一步讨论。