我无法理解我的 SQL 查询出了什么问题。
我尝试过对所需的列建立索引,但效果不佳。
这是我的查询的一部分(这似乎是一个问题)
select
t1.column1,
t2.column2,
t1.column3,
t1.column4,
t1.column5
from
table_1 as t1
left join
(select
column1,
column2,
column3
from
table_2
where
column3 = 1) as t2
on t1.column1 = t2.column1
order by
t1.column1
我也尝试了以下方法
select
t1.column1,
t2.column2,
t1.column3,
t1.column4,
t1.column5
from
table_1 as t1
left join table_2 as t2
on t1.column1 = t2.column1
and t2.column3 = 1
order by
t1.column1
当表中的数据超过3k时,上面的代码执行速度很慢。检索信息通常需要几毫秒,但当数据增加到 2k-10k 时,需要 2 秒或 3 秒。
我想知道是否有任何解决方案可以提高上述 SQL 查询的性能。
我发现的问题是由 order by 语句引起的。
最佳答案
如果没有真实表的上下文,没有人会知道辅助表可能存在多行。也就是说,您将从 table1 中获取每一行,但如果 table2 中有多行,您将返回多行(这是可以的)。
希望优化查询的唯一真正方法是拥有适当的索引。
您的 Table1 应该在 (column1) 上有一个索引,因为这是 ORDER BY 子句的基础...如果您将 WHERE 子句应用于 table1 以优化此类记录的过滤,您还可以添加其他列。
对于 Table2,最好在 3 个字段上建立一个覆盖索引,并按以下顺序排列: (第 3 列、第 1 列、第 2 列)。 Column3由于WHERE子句而被优化。第 1 列是表 1 的 LEFT-JOIN 的基础。最后,column2 是您从子查询中提取的唯一列(如果找到此类记录)。
在子查询中,您甚至不需要返回 column3,因为您已将其预先限定为特定值,并且它不会在最终结果集中使用。
关于mysql - 如何更改 SQL 查询以使其对更大的数据集执行得更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55323445/