簡體   English   中英

MySQL左連接查詢太慢

[英]MySQL left join query too slow

我正在使用此SQL查詢連接兩個表,即使限制為10,也要花10秒。我檢查了表是否已建立索引並且它們是否索引,所以我沒有主意。 任何幫助將不勝感激。

SELECT * FROM client_registration_request
LEFT JOIN customers ON (client_registration_request.customer_reference=customers.reference) 
LEFT JOIN region_info ON ( customers.country = region_info.id ) 
WHERE client_registration_request.client = 23
LIMIT 10

這是來自說明選擇的結果

說明選擇

client_registration_request索引

client_registration_request索引

客戶指數

客戶指數

和region_info索引 和region_info索引

始終確保用於JOIN的字段已被索引-條件:

ALTER TABLE `client_registration_request` ADD INDEX `customer_reference` (`customer_reference`);
ALTER TABLE `customers` ADD INDEX `reference` (`reference`);

.. 等等。

更新:您的EXPLAIN顯示未使用索引關鍵字customers表。 因此,請嘗試重新索引它們:

ALTER TABLE `customers` ADD INDEX `reference` (`reference`);
ALTER TABLE `customers` ADD INDEX `country` (`country`);

您編寫查詢的方式是在執行兩個左聯接之后限制並過濾結果,這就是為什么它需要花費相同的時間來查詢的原因。

為了使其更快,您需要盡快對其進行限制和過濾,如果您想在進行任何連接之前對其進行限制和過濾。

在使用LEFT JOINS時,您可以限制和過濾第一個表,但仍得到相同的結果。 嘗試這個:

SELECT * FROM 
(SELECT * FROM client_registration_request WHERE client_registration_request.client = 23 LIMIT 10) client_registration_request_TMP
LEFT JOIN customers ON (client_registration_request_TMP.customer_reference=customers.reference) 
LEFT JOIN region_info ON ( customers.country = region_info.id )

這是使用表別名的查詢(因此,我覺得更容易理解):

SELECT *
FROM client_registration_request crr LEFT JOIN
     customers c
     ON crr.customer_reference = c.reference LEFT JOIN
     region_info r
     ON c.country = r.id
WHERE crr.client = 23
LIMIT 10

最重要的索引在client_registration_request(client) 但是,我將在其中包括其他join列。 因此,第一個索引是client_registration_request(client, reference, country) 您可以將其創建為:

create index idx_client_registration_request_3 on client_registration_request(client, reference, country);

我假設其他表中的鍵已經是主鍵或已索引。 如果沒有,您也應該在它們上建立索引customer(reference)region_info(country)

在沒有ORDER BY情況下使用LIMIT是可疑的。 運行查詢時,您將獲得任意一組匹配的行-您不能保證兩次運行都會返回相同的行。

暫無
暫無

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

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