为什么!=运算符比=运算符快?
我有一个 SQLite 数据库,我执行以下查询:
SELECT
category,
name,
COUNT(side.id) as nb
FROM main
LEFT JOIN side
ON main.id = side.id_main
WHERE category != 3
GROUP BY category, name;
此查询大约需要 0.3 秒并返回 8000 行。这是关联的查询计划:
id parent notused detail
7 0 0 SCAN TABLE main USING COVERING INDEX idx_main
19 0 0 SEARCH TABLE side USING AUTOMATIC COVERING INDEX (id_main=?)
id parent notused detail
7 0 0 SCAN TABLE main USING COVERING INDEX idx_main
19 0 0 SEARCH TABLE side USING AUTOMATIC COVERING INDEX (id_main=?)
现在,我只想选择一个类别。所以,我改写了我的WHERE条款是这样的:
这个查询现在需要大约 43 秒并返回 5000 行!长了100倍!这是关联的查询计划:
id parent notused detail
7 0 0 SEARCH TABLE main USING COVERING INDEX idx_main (category=?)
11 0 0 SCAN TABLE side
id parent notused detail
7 0 0 SEARCH TABLE main USING COVERING INDEX idx_main (category=?)
11 0 0 SCAN TABLE side
为什么等于运算符这么慢?我的查询有什么问题吗?
繁殖步骤:
- 创建以下表
SELECT
category,
name,
COUNT(side.id) as nb
FROM main
LEFT JOIN side
ON main.id = side.id_main
WHERE category = 1
GROUP BY category, name;
- 使用以下 Perl 脚本填充表