[英]Optimising a MySQL query with a Left Join and a sub-query
我有很多這樣的查詢...
SELECT colA, colB, colC, colD FROM table1
LEFT JOIN (
SELECT colD FROM table2 WHERE colE = 3225
) AS subquery
ON colD = colA ;
哪些列在我的服務器的“ log-queries-not-using-indexes”日志中。
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 ;
提前致謝,
你的
菲爾
我會嘗試以下方法:
SELECT ColA, ColB, ColC, ColD
FROM
table1
LEFT JOIN table2
ON ColE = 3225
AND ColD = ColA
另外,嘗試在table2
上創建一個同時覆蓋ColE
和ColD
的索引:
CREATE INDEX `IDX_table2` on `table2` (`colE` ASC, `colD` ASC);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.