[英]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.