我有以下查询:
SELECT COUNT( * )
FROM Table1 AS T1
LEFT JOIN Table2 AS T2
USING ( col1 )
WHERE T1.col1 != '1'
AND T1.col2
IN (
'A', 'A-B'
)
AND T1.col3 = 'X'
AND T2.col11= '1'
AND T1.col4 = 'YZ'
此查询需要 1秒才能执行。如果我将COUNT(*)
替换为SELECT(*)
,则还会占用 1秒。但是,如果我最后添加LIMIT 0,30
,则会在 0.02秒中执行。
我在WHERE
子句中的所有列都有索引。我甚至在Table1
中有一个综合指数。
以下是此查询的EXPLAIN EXTENDED
:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE T1 ref PRIMARY,col4,col3,col2,col1,CompositeIndex... CompositeIndex1 2 const 2010 100 Using where
1 SIMPLE T2 eq_ref PRIMARY,CompositeIndex1,incomeLevel PRIMARY 4 T1.col1 1 100 Using where
为什么此查询需要这么长时间,如何可以让它更快?
答案 0 :(得分:0)
对于初学者,您使用LEFT join
但需要T2.col11= '1'
除此之外,没有足够的信息可以发表评论,只是说我希望你没有真正为你的专栏编号。
答案 1 :(得分:0)
这是您的原始查询
SELECT COUNT( * )
FROM Table1 AS T1
LEFT JOIN Table2 AS T2
USING ( col1 )
WHERE T1.col1 != '1'
AND T1.col2
IN (
'A', 'A-B'
)
AND T1.col3 = 'X'
AND T2.col11= '1'
AND T1.col4 = 'YZ'
你需要做两件事来加快速度
这是您的重构查询
SELECT COUNT(T1.col1) FROM
(SELECT col1 FROM T1 WHERE col3='X' AND
col4='YZ' AND col2 IN ('A','A-B') AND col1<>'1') T1
INNER JOIN (SELECT col1 FROM T2 WHERE T2.col11='1') T2
USING (col1);
ALTER TABLE T1 ADD INDEX col3421_index (col3,col4,col2,col1);
ALTER TABLE T2 ADD INDEX col11_1_index (col11,col1);
试一试!!!