MySQL离开连接查询太慢了

时间:2014-11-26 10:36:03

标签: mysql sql

我使用这个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

以下是解释选择

的结果

explain select

client_registration_request索引

client_registration_request index

客户指数

customers index

和region_info索引 and region_info index

3 个答案:

答案 0 :(得分:1)

始终确保您为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`);

答案 1 :(得分:0)

您编写查询的方式是限制并在两次左连接执行后过滤结果,这就是为什么它会花费相同的时间进行查询。

为了加快速度,您需要尽快限制和过滤它,在您的情况下,您希望在任何连接之前限制和过滤它。

当您使用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 )

答案 2 :(得分:0)

这是您的查询,使用表别名(所以我觉得更容易理解):

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)上建立索引。

使用LIMIT而不是ORDER BY是可疑的。运行查询时,您将获得一组任意匹配的行 - 您不能保证两次运行将返回相同的集合。