我有一个查询需要很长时间,因为对一个非常大的表进行了不可思议的全面扫描。
EXPLAIN
SELECT count(*)
FROM BigTable
WHERE (username = 'me' OR id IN (SELECT id FROM SmallTable WHERE username = 'me'));BigTable为username和id列都有索引。所以我认为这个查询非常快,但实际上它需要很长时间,因为mysql查询了所有400万行BigTable。
解释申报表:
1,主,BigTable,索引,BigTable_N52,BigTable_N52,9,NULL,4364507,“使用何处;使用索引” 2,SUBQUERY,SmallTable,ref,“.”,SmallTable_username,9,const,11,NULL
令人惊讶的是,当我删除子查询并添加实际is时,性能和查询计划器策略就像预期的那样:
EXPLAIN
SELECT count(*)
FROM BigTable
WHERE (username = 'me' OR id IN (1,2,3,4));解释:
1,BigTable,index_merge,“BigTable_N52","BigTable_N52,BigTable_N52”,"9,8",NULL,236,“使用union(BigTable_N52,BigTable_N52);使用where”
有什么我能解决的办法吗?
发布于 2015-08-12 08:15:36
SELECT SUM(c_rec) FROM
(
SELECT count(*) AS c_rec
FROM BigTable
WHERE (username = 'me')
UNION ALL
SELECT count(*)
FROM BigTable
WHERE id
IN (SELECT id FROM SmallTable WHERE username = 'me')
) t试试这个解决方案。
发布于 2015-08-16 01:39:16
构造IN ( SELECT ... )的优化效果很差。把它变成一个JOIN。
除了@realnumber3012 3012的UNION之外,执行此UNION还将使其速度更快。
至于因加入而导致的通货膨胀,请试一试:
SELECT COUNT(*)
FROM
(
( SELECT id
FROM BigTable
WHERE username = 'me'
) UNION DISTINCT
( SELECT id
FROM BigTable b
JOIN SmallTable s USING(id)
WHERE s.username = 'me')
)
) t 如果以两种方式查找ids,则在DISTINCTifies之前对它们进行COUNTing。
https://stackoverflow.com/questions/31959601
复制相似问题