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
c、dの複合インデックスが役立つかどうかを確認してください。なぜOR tableb.d = 1 - これはパフォーマンスを傷つけ、代わりにunionを使ってみるのですか? –
"SHOW VARIABLES LIKE '%innodb%'の出力をポストします。 Darhazerの答えに加えて、InnoDBのデフォルトの設定が正しいかのように見えます。 –