由于对一张非常大的桌子进行了不必要的全扫描,我的查询需要很长时间。
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,PRIMARY,BigTable,index,BigTable_N52,BigTable_N52,9,NULL,4364507,“使用where;使用索引”
2,SUBQUERY,SmallTable,ref,“...”,SmallTable_username,9,const,11,NULL
令人惊讶的是,当我删除子查询并添加实际ID时,性能和查询计划程序策略如预期一样:
EXPLAIN
SELECT count(*)
FROM BigTable
WHERE (username = 'me' OR id IN (1,2,3,4));
说明:
1,SIMPLE,BigTable,index_merge,“PRIMARY,BigTable_N52”,“BigTable_N52,PRIMARY”,“9,8”,NULL,236,“使用union(BigTable_N52,PRIMARY);使用where”
关于如何修复它的任何想法?
答案 0 :(得分:1)
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
尝试此解决方案。