我使用这个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索引
答案 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
是可疑的。运行查询时,您将获得一组任意匹配的行 - 您不能保证两次运行将返回相同的集合。