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(*)と、 1秒SELECT(*)以上かかります。ただし、最後に追加すると、わずか0.02秒で実行されます。LIMIT 0,30

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'

これを高速化するには、2 つのことを行う必要があります

クエリのリファクタリング

これがリファクタリングされたクエリです

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 に答える