关于数据库:SQL优化案例or改为union

![Uploading file…]()

原始SQL(均匀执行工夫2s+)

SELECT DISTINCT
    sid
FROM
    test
WHERE
    cid = 123456
AND (
    (eid = 7890123)
    OR sid IN (
        SELECT
            sid
        FROM
            test
        WHERE
            cid = 123456
        GROUP BY
            sid
        HAVING
            COUNT(*) = 1
    )
)

430万+数据量的表,索引如下:

KEY idx_eid (eid)
KEY index_0 (cid,type)
KEY index_1 (sid,type,eid)
KEY idx_cs (cid,sid)

优化后SQL(均匀执行工夫400ms左右)

SELECT DISTINCT sid FROM test  WHERE cid = 900458 AND eid = 1021355 
union  
SELECT sid FROM test  WHERE cid = 900458 GROUP BY sid HAVING COUNT(*) = 1

阐明:
mysql版本5.6.28
优化前,test和子查问都应用的idx_cs索引,cid 的基数不如eid,所以拆开后第一个test 应用eid索引,第二次应用的idx_cs

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理