2011-02-10 51 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 

此查詢需要像10秒運行,如果tablea.d = 100給出1500行和(tablea.d = tableb.d OR tableb.d = 1)給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 - imho會損害性能,請嘗試使用union? – 2011-08-22 11:58:34

回答

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)上的索引。