2011-10-28 14 views
1

私は5つの列にまたがる主キーを持つmyisamテーブルを持っています。私は、これらの5つの列すべてにANDを使ってWHEREを使って選択します。主キー(複数列索引)を使用すると、1つの列に1つの索引を使用して1秒かかると、25秒かかります。私はプロファイリングを行い、25年代の大半は「データの送信」段階で取り上げられました。主キーは約7Mのカーディナリティを持ち、単一の列は約80です。複数の列インデックスがmysqlの単一列インデックスよりも遅い

CREATE TABLE `mytable` (
    `a` int(11) unsigned NOT NULL, 
    `b` varchar(2) NOT NULL, 
    `c` int(11) unsigned NOT NULL, 
    `d` varchar(560) NOT NULL, 
    `e` varchar(45) NOT NULL, 
    PRIMARY KEY (`a`,`e`,`d`,`b`,`c`), 
    KEY `d` (`d`), 
    KEY `e` (`e`), 
    KEY `b` (`b`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 


EXPLAIN SELECT * FROM mytable USE INDEX (PRIMARY) 
WHERE a=12 AND e=1319677200 AND d='69.171.242.53' AND b='*' AND c=0; 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE i ref PRIMARY PRIMARY 4 const 5912231 Using where 


EXPLAIN SELECT * FROM mytable 
WHERE a=12 AND e=1319677200 AND d='69.171.242.53' AND b='*' AND c=0; 

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE i ref PRIMARY,d,e,b d 562 const 158951 Using where 
+0

テーブル定義& 'EXPLAIN'出力を投稿してください。 –

答えて

2

問題が鋳造によって引き起こされ、
トライ引用すべてのvarchar列b,d,e

SELECT * FROM mytable USE INDEX (PRIMARY) 
WHERE a=12 AND e='1319677200' AND d='69.171.242.53' AND b='*' AND c=0; 
+0

あなたは正しいです、私はSQLから少なくともエラーを予想していた、私は1319677200と比較できるように整数にすべての列を変換する時間を過ごしていたと思います。 – Ricardo

関連する問題