2 ogrenosakini ogrenosakini 于 2016.04.02 08:56 提问

新人求助 关于 left join添加索引

情况是left join 进来的T4,T5,T6 导致sql文太慢,大概60s。
因为才接触sql文没多久,对于这个不是很懂,百度了一下没有找到合适的资料,特来求助。望大神给予详细解答。非常感谢。

SQL如下:
SELECT *
FROM T1
INNER JOIN T2
ON T1.×× = T2.××
INNER JOIN T3
ON T2.×× = T3.××

LEFT JOIN T4
ON T1.○○ = T4.○○
LEFT JOIN T5
ON T1.○○ = T5.○○
LEFT JOIN T6
ON T1.○○ = T6.○○
AND T6.CD = 01

INNER JOIN T7
ON T2.△△ = T7.△△
INNER(SELECT DISTICT T82.×○
FROM T81
INNER JOIN T82
ON T81.×× = T82.××
WHERE EC_NO = 'DA2846')T9
ON T1.△△ = T9.△△
WHERE T3.FOM_STS BETWEEN 1 AND 3
AND T7.EC_NO = 'DA2846'
GROUP BY ......

3个回答

oyljerry
oyljerry   Ds   Rxr 2016.04.02 09:31

join on中的几个列是否都建立了索引

ogrenosakini
ogrenosakini 没有的~都没有建立索引~
2 年多之前 回复
cxsmarkchan
cxsmarkchan   2016.04.02 09:38
  1. left join后的结果无法建立索引,但你可以对每个表参与join的字段建立索引。
  2. 你这个语句有大量连接操作,而且含有外连接会生成很大的表,所以比较慢。建议你先进行选择操作,再连接。例如你的条件中含有对T3和T7的判断语句,这两个判断语句可以直接放在对T3和T7的连接上,减少生成的表的大小,而不要放在所有表都连接到一起后再选择需要的数据。
cxsmarkchan
cxsmarkchan 回复ogrenosakini: 如果你确实不需要t4/t5/t6中的全部内容,一般的思路就是先确认你需要什么内容,然后把t4替换成(select * from t4 where ...) as tt4这样。也就是把t4替换成更小的表。
2 年多之前 回复
cxsmarkchan
cxsmarkchan 回复ogrenosakini: 如果你在连接的时候没有选择语句的话,那没什么办法,因为你生成的表就是要包含t4,t5,t6的每一项。但我最后也没看到你用t4,t5,t6中的任何内容啊。
2 年多之前 回复
ogrenosakini
ogrenosakini 谢谢你的解答。但是还有一个问题就是在left join t4,t5,t6的时候,这3张表被full access了,导致时间比较长,话说这个有办法优化么?
2 年多之前 回复
ogrenosakini
ogrenosakini 回复cxsmarkchan: 还有一个问题是在left join t4,t5,t6的时候,这3张表被full acces
2 年多之前 回复
cxsmarkchan
cxsmarkchan 回复ogrenosakini: 是这个意思,建议打上括号,清晰一些。例如INNER JOIN T3 ON (T2.×× = T3.×× AND (T3.FOM_STS BETWEEN 1 AND 3))
2 年多之前 回复
ogrenosakini
ogrenosakini 直接放在对T3和T7的连接上?是写成INNER JOIN T3 ON T2.×× = T3.×× AND T3.FOM_STS BETWEEN 1 AND 3这个意思么?
2 年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.04.02 15:02

left join
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
mysql中高效查询(left join 和 group by),前提是加了索引
mysql中高效查询(left join 和 group by)
【已解决】mysql left join使用不了索引问题
在本地建了两张表,一张order表和一张zx表,事先我在两表内都创建了unique的索引(end_date,ownerid),然后用order表 left join zx表没用上索引,而zx表left join order表却能用上索引。
mysql join 和left join 对于索引的问题
今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录:  select c.* from hotel_info_original c  left join hotel_info_collection h  on c.hotel_type=h.hotel_type and c.hotel_id =h.
MySQL的join查询和索引
原文地址:http://blog.163.com/lgh_2002/blog/static/4401752620105190332893/ 1 关于join查询 下面是例子分析 表A记录如下:  aID aNum  1 a20050111  2 a20050112  3 a20050113  4 a20050114  5 a20050115 表B记录如下:  bI
Mysql多个LEFT JOIN使用ORDER不能使用索引导致查询过慢的解决方案
转自:http://www.tuicool.com/articles/qemmMfY Mysql在多个LEFT JOIN的情况下使用ORDER BY排序,就算是其中一个表的主键也仍然使用file sort排序,数据量多的话就相当的慢。 优化前语句 SELECT * FROM a LEFT JOIN b ON a.id=b.a_id ORDER a.id DESC
Mysql多个LEFT JOIN使用ORDER BY不能使用索引导致查询过慢的解决方案
Mysql在多个LEFT JOIN的情况下使用ORDER BY排序,就算是其中一个表的主键也仍然使用file sort排序,数据量多的话就相当的慢。 优化前语句 SELECT * FROM a LEFT JOIN b ON a.id=b.a_id ORDER a.id DESC 优化后语句 SELECT * FROM a LEFT JOIN b ON a.id=b.a_id
oracle中优化left join的工作心得
最近领导要求一个任务,大致可以如下解释。 有A表和B表,两个表均有ID和DATE字段,A表存储一个完整的数列SEQ,B表描述了A数列的某段所携带的信息VAL,标记了起始数列号SEQ_START和终止数列号SEQ_END,要求生成一个根据B表标记A表指定数列VAL值的表 A表: id     date              seq 1      2011/12/1   1 1
oracle实现left join的两种写法
select * from a,b where a.id=b.id(+);--该写法的执行效率高 select * from a left join b on a.id=b.id;
SQL查询优化 LEFT JOIN和INNER JOIN
1, 连接了八个数据库表,而且全部使用LEFT JOIN,如下所示: Resource_Resources A LEFT JOIN Resource_Clients B ON A.ResourceId = B.ResourceId  LEFT JOIN Resource_Files C on B.ClientId=C.ClientId  LEFT JOIN Resource_Client
mysql联合查询强制走索引(force index,GROUP BY)
mysql联合查询强制走索引(force index,GROUP BY) 有一些SQL语句需要实时地查询数据,或者并不经常使用(可能一天就执行一两次),这样就需要把缓冲关了,不管这条SQL语句是否被执行过,服务器都不会在缓冲区中查找,每次都会执行它。 MySQL中force Index 强制索引:强制查询缓冲SQL_CACHE oid是普通索引: SELECT t1.v