如何调整极限句的性能?

时间:2016-10-27 04:31:08

标签: mysql

我运行以下MYSQL句子,但它花费超过10秒,虽然它只返回10行。顺便说一句,如果我删除LIMIT 0,10,它将返回1,000,000行。我为列SceneCode创建了Index1,为ColumnId列创建了Index2。

SELECT *
FROM
(SELECT * FROM gf_sceneprovider WHERE SceneCode='DL00000003'    ) AS sprovider
    LEFT JOIN  (SELECT * FROM gf_sceneprovidertemplate WHERE SceneCode='DL00000003'      ) AS stemplate
ON sprovider.ProviderId = stemplate.ProviderId
    INNER JOIN gf_provider AS provider 
ON provider.ProviderId = sprovider.ProviderId 
LIMIT 0, 10

enter image description here

1 个答案:

答案 0 :(得分:2)

我会废除子查询以支持直接连接:

SELECT *
FROM gf_sceneprovider sprovider
LEFT JOIN gf_sceneprovidertemplate stemplate
    ON sprovider.ProviderId = stemplate.ProviderId
INNER JOIN gf_provider AS provider 
    ON provider.ProviderId = sprovider.ProviderId 
WHERE sprovider.SceneCode = 'DL00000003' AND
      stemplate.SceneCode = 'DL00000003'
LIMIT 0, 10

然后,如果可能,在连接列上添加索引。您的原始子查询可能会阻止gf_sceneprovidergf_sceneprovidertemplate表上的索引被有效使用/根本无法使用。这样做的原因是您的子查询基本上创建了一个动态表,与它们选择的表不同,它没有索引。我认为某些RDMBS可以在某些情况下应对这种情况,但看起来情况并非如此。