2012-10-16 62 views
1

我有一些像這樣的查詢...這得到我的服務器的上市優化與左MySQL查詢聯接和子查詢

SELECT colA, colB, colC, colD FROM table1 
    LEFT JOIN (
    SELECT colD FROM table2 WHERE colE = 3225 
) AS subquery 
ON colD = colA ; 

「查詢 - 不使用日誌「指數」日誌。

的EXPLAIN看起來像這樣...

id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra 
---+-------------+------------+-------+---------------+---------+---------+------+------+------------- 
1 | PRIMARY  | table1  | range | PRIMARY  | PRIMARY | 3  | NULL | 58 | Using where 
1 | PRIMARY  | <derived2> | ALL |   NULL | NULL | NULL | NULL | 1 | 
2 | DERIVED  | table2  | const | PRIMARY  | PRIMARY | 3  |  | 1 | 

有什麼辦法,我可以重新構建查詢,或是否有任何新的索引我要補充,以提高呢?

僅供參考表中的構成就像這樣......

CREATE TABLE `table1` (
`colA` MEDIUMINT(9) NOT NULL , 
`colB` VARCHAR(100) DEFAULT NULL , 
`colC` VARCHAR(6) DEFAULT NULL , 
some more columns removed to simplify things... 
PRIMARY KEY ( `colA`) , 
KEY `colB` ( `colB`) , 
KEY `colC` ( `colC`) 
) ENGINE = MYISAM DEFAULT CHARSET = latin1 ; 


CREATE TABLE `table2` (
`colE` mediumint(9 ) NOT NULL auto_increment , 
`colD` mediumint(9 ) default '0', 
some more columns removed to simplify things... 
PRIMARY KEY ( `colE` ) , 
KEY `colD` ( `colD` ) 
) ENGINE = MyISAM DEFAULT CHARSET = latin1 ; 

由於提前,

此致

菲爾

回答

0

我會嘗試以下方法:

SELECT ColA, ColB, ColC, ColD 
FROM 
    table1 
    LEFT JOIN table2 
     ON ColE = 3225 
     AND ColD = ColA 

另外,嘗試創建一個涵蓋table2ColEColD索引:

CREATE INDEX `IDX_table2` on `table2` (`colE` ASC, `colD` ASC); 
+0

好極了,這確實起作用,即使不增加新的索引。非常感謝。 我可以做什麼更復雜的版本是這樣的... 'SELECT可樂,COLB,COLC,冷FROM表1 LEFT JOIN( SELECT DISTINCT冷遇表2 WHERE colF = 'SomeText' )AS子查詢 ON colD = colA;' 謝謝 –

+0

我已經根據您以前的指導回答了我自己的問題 - 它的'SELECT DISTINCT colA,colB,colC,colD FROM table1 LEFT JOIN table2 ON colF ='SomeText'AND colD = colA' - 再次感謝 –