2013-05-31 79 views
3

我有兩個錶慢得多(降低到重要字段):MySQL的InnoDB的不是MyISAM數據

syskeywordobjects: 
pksyskeywordobjects BIGINT 
fksyskeywords BIGINT 
fkcontents BIGINT 

fkcontents INDEX (fkcontents) 
fksyskeywords INDEX (fksyskeywords) 
fkcontents_fksyskeywords INDEX (fkcontents, fksyskeywords) 


syskeywords: 
pksyskeywords BIGINT 
keyword VARCHAR 

keyword INDEX (keyword) 

在這兩個表我運行下面的查詢:

SELECT k.pksyskeywords, k.keyword, COUNT(k.pksyskeywords) AS counter 
FROM syskeywordobjects ko INNER JOIN syskeywords k ON ko.fksyskeywords = k.pksyskeywords 
WHERE (
    k.pksyskeywords <> 1218713201167374664 
    AND EXISTS (
     SELECT innerko.pksyskeywordobjects 
     FROM syskeywordobjects innerko 
     WHERE ko.fkcontents = innerko.fkcontents 
     AND innerko.fksyskeywords = 1218713201167374664 
    ) 
) 
GROUP BY k.pksyskeywords, k.keyword 
ORDER BY counter DESC 
LIMIT 20 

如果表使用MyISAM的查詢需要大約1-2s,但如果我使用InnoDB(我必須)它需要25-30s。爲什麼InnoDB慢20倍?

如需進一步的幫助,請查看解釋結果。

InnoDB: 
id select_type   table type possible_keys          key      key_len ref     rows Extra 
1  PRIMARY    k  range PRIMARY            PRIMARY     8   NULL     52051 Using where; Using temporary; Using filesort 
1  PRIMARY    ko  ref  fksyskeywords          fksyskeywords    8   k.pksyskeywords  1  Using where 
2  DEPENDENT SUBQUERY innerko ref  fkcontents,fksyskeywords,fkcontents_fksyskeywords fkcontents_fksyskeywords 16  ko.fkcontents,const 1  Using index 

MyISAM: 
id select_type   table type possible_keys          key       key_len ref     rows  Extra 
1  PRIMARY    ko  index fksyskeywords          fkcontents_fksyskeywords 16   NULL     277823 Using where; Using index; Using temporary; Using f... 
1  PRIMARY    k  eq_ref PRIMARY            PRIMARY      8   ko.fksyskeywords  1  
2  DEPENDENT SUBQUERY innerko ref  fkcontents,fksyskeywords,fkcontents_fksyskeywords fkcontents_fksyskeywords 16   ko.fkcontents,const 1  
+0

如果你運行'SHOW VARIABLES LIKE'%buffer_pool%';',你會得到什麼? –

+0

innodb_buffer_pool_size設置爲8388608 – Werzi2001

+0

什麼是Oracle吸菸? http://www.oracle.com/partners/en/knowledge-zone/mysql-5-5-innodb-myisam-522945.pdf – duffymo

回答

5

爲了讓InnoDB更快地工作,您應該始終將innodb_buffer_pool設置爲一個很大的值。它允許InnoDB將工作數據集存儲在內存中(表數據,索引數據結構),因此工作速度更快(RAM> IO的IO)。如果我沒有弄錯,默認值是8MB,我個人有80%的可用內存。