繁体   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