1

我有以下查询:

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 seconds 内执行。

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

为什么这个查询需要这么长时间,我怎样才能让它更快?

4

2 回答 2

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

试试看 !!!

于 2013-03-21T16:21:10.520 回答
0

对于初学者,您正在使用LEFT join但需要T2.col11= '1'

除此之外,没有足够的信息可以发表评论,只是说我希望你不要真正为你的专栏编号。

于 2013-03-21T15:04:30.103 回答