我有一个特定的查询,我想在(特定日期)主表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
要使用的最佳索引是什么?
以下是我的实验和结果:
无索引
Query took 130.0157 seconds.
WHERE变量索引(表A中的日期)
Query took 111.722 seconds.
JOIN变量的索引(表A中的列A和表B中的列B)
Query took 10.578 seconds.
JOIN和WHERE变量的索引(A列上的一个索引,表A和表B中的另一个日期)
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**
在表A上为创建一个复合索引可能会更好
(date, columnA)
以及表B上的索引
(columnB)
用实际需要的列列表替换*
可能会有所帮助。如果存在不需要的TEXT
列,这将特别有用。
如果你不需要LEFT
,就去掉它。这样,优化器可能会选择从tableB开始。目前,该选项可能被禁止。
tableA: INDEX(date)
tableB: INDEX(columnB)
CCD_ 5将不会有任何帮助,因为查询将只针对所有CCD_ 6。
CCD_ 7只有在去除CCD_。注意:"嵌套循环联接"是这样或那样的。也就是说,您需要在第二个表上建立索引;在CCD_ 9的另一侧具有相应的索引是无用的。
你有两次计时吗?第一次将填充缓存;第二次将节省I/O。只考虑第二个。
提供EXPLAIN SELECT ...
以供进一步讨论。