慢COUNT(*)查询执行时间超过1秒,如何让它更快?

时间:2013-03-21 14:50:19

标签: mysql query-optimization

我有以下查询:

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

为什么此查询需要这么长时间,如何可以让它更快?

2 个答案:

答案 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'

你需要做两件事来加快速度

REFACTOR THE QUERY

这是您的重构查询

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);

试一试!!!