改善简单的SQL选择性能

时间:2017-07-11 23:43:16

标签: mysql sql

我有两个包含一些数据的表(> 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毫秒(我知道这是因为在这种情况下我通过第一个解释行排序),但我真的需要订购靠桌子。

我有什么遗失的吗?

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)