2011-02-10 11 views
2

私は実際には遅いクエリを実行しているMySqlデータベースを持っています。私はそれがより良い実行することができますが、私がここで間違っているかを見ることができない最高を試しています。たぶんあなたはできる?MySql InnoDBデータベースでの低速クエリの最適化

CREATE TABLE `tablea` (
    `a` int(11) NOT NULL auto_increment, 
    `d` mediumint(9) default NULL, 
    `c` int(11) default NULL, 
    PRIMARY KEY (`a`), 
    KEY `d` USING BTREE (`d`) 
) ENGINE=InnoDB AUTO_INCREMENT=1867710 DEFAULT CHARSET=utf8; 

CREATE TABLE `tableb` (
    `b` int(11) NOT NULL auto_increment, 
    `d` mediumint(9) default '1', 
    `c` int(10) NOT NULL, 
    `e` mediumint(9) default NULL, 
    PRIMARY KEY (`b`), 
    KEY `c` (`c`), 
    KEY `d` (`d`), 
) ENGINE=InnoDB AUTO_INCREMENT=848150 DEFAULT CHARSET=utf8; 

クエリ:

SELECT tablea.a, tableb.e 
FROM tablea 
INNER JOIN tableb ON (tablea.c=tableb.c) AND (tablea.d=tableb.d OR tableb.d=1) 
WHERE tablea.d=100 

このクエリはtablea.d = 100が1500行と(tablea.d = tableb.d OR tableb.d = 1)が得られる場合に実行する10秒のようになります1600行を与える。これは本当に遅いようです。私はそれをはるかに速くする必要がありますが、私は何が間違っているのか分かりません。

MySQLは出力をEXPLAIN:

id select_type table type possible_keys key key_len ref  rows Extra 
1 SIMPLE  tablea ref d    d 4  const  1092 Using where 
1 SIMPLE  tableb ref c,d   c 4  tablea.c 1  Using where 
+1

c、dの複合インデックスが役立つかどうかを確認してください。なぜOR tableb.d = 1 - これはパフォーマンスを傷つけ、代わりにunionを使ってみるのですか? –

+0

"SHOW VARIABLES LIKE '%innodb%'の出力をポストします。 Darhazerの答えに加えて、InnoDBのデフォルトの設定が正しいかのように見えます。 –

答えて

0

私はORで混乱しておりません場合は、クエリは同等です:

SELECT tablea.a, tableb.e 
FROM tablea 
    INNER JOIN tableb 
    ON tablea.c = tableb.c 
WHERE tablea.d = 100 
    AND tableb.d IN (1,100) 

さまざまなインデックスと(EXPLAINを使用して)それを試してみてください。 dフィールドのインデックス(どちらのテーブルにも)が役立ちます。多分、より多くの、(d,c)の指数。