我有两个包含一些数据的表(> 300_000行),这个简单的查询需要大约1秒钟。 有什么想让它更快?
SELECT a.*
FROM a
INNER JOIN b on (a.b_id = b.id)
WHERE b.some_int_column = 2
ORDER BY a.id DESC
LIMIT 0,10
两者,a.b_id和b.some_int_column都有索引。此外,a.id和i.id是整数主键。
当我尝试解释时,首先说它是使用some_int_column索引,带有临时和文件输出。
如果我执行相同的查询,但是按b.id ASC排序则需要大约0.2毫秒(我知道这是因为在这种情况下我通过第一个解释行排序),但我真的需要订购靠桌子。
我有什么遗失的吗?
答案 0 :(得分:1)
a
试试这个。因为您要过滤表B中的列,而不是表A中的列。这可能会减少读取的数据量。根据sql优化器,它可以匹配连接中的所有记录,然后过滤掉那些= 2。但是反转它,优化器可能只将表b中的记录与where子句中的= 2匹配。
答案 1 :(得分:1)
对于此查询:
SELECT a.*
FROM a INNER JOIN
b
ON a.b_id = b.id
WHERE b.some_int_column = 2
ORDER BY a.id DESC
LIMIT 0, 10;
最佳索引可能是b(some_int_column, id)
和a, b_id, id)
。
您可能会发现此版本在这些索引中具有更好的性能:
SELECT a.*
FROM a
WHERE EXISTS (SELECT 1
FROM b
WHERE a.b_id = b.id AND b.some_int_column = 2
)
ORDER BY a.id DESC
LIMIT 0, 10;
对于此查询,索引应为a(id, b_id)
和b(id, some_int_column)
。