[英]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索引
客戶指數
和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.