2011-10-28 197 views
1

我有一個主鍵跨越5列的myisam表。我在這5列中的每一列上都進行了一次選擇。使用主鍵(多列索引)需要25秒,在一列中使用單個索引需要1秒。我做了剖析,大部分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