我运行以下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
答案 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_sceneprovider
和gf_sceneprovidertemplate
表上的索引被有效使用/根本无法使用。这样做的原因是您的子查询基本上创建了一个动态表,与它们选择的表不同,它没有索引。我认为某些RDMBS可以在某些情况下应对这种情况,但看起来情况并非如此。