子查询

时间:2015-08-12 08:12:32

标签: mysql sql database performance

由于对一张非常大的桌子进行了不必要的全扫描,我的查询需要很长时间。

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”

关于如何修复它的任何想法?

1 个答案:

答案 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

尝试此解决方案。