簡體   English   中英

使用左聯接和子查詢優化MySQL查詢

[英]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上創建一個同時覆蓋ColEColD的索引:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM