如何更改SQL查询以使其更快地执行更大的数据集?

问题描述 投票:0回答:2

我无法理解我的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查询的性能。

我发现的问题来自于逐语。

mysql
2个回答
0
投票

如果没有真实表的上下文,没有人会知道辅助表的多行可能性。也就是说,你将获得table1中的每一行,但是如果table2中有多行,你将返回多行(这是可以的)。

希望优化查询的唯一真正方法是使用适当的索引。

你的Table1应该在(column1)上有一个索引,因为它是ORDER BY子句的基础......如果你在表1中应用WHERE子句来优化对这些记录的过滤,你还可以添加其他列。

对于Table2,最好在3个字段上按顺序(column3,column1,column2)设置覆盖索引。 Column3由于WHERE子句而优化。第1列,因为它是表1的LEFT-JOIN的基础。最后是column2,因为如果找到这样的记录,那么你就是从子查询中提取的唯一列。

在子查询中,您甚至不需要返回column3,因为您将它预先限定为特定值,并且它不会在最终结果集中使用。


0
投票

不,mysql性能取决于结果数据的长度,而不是查询。谢谢

© www.soinside.com 2019 - 2024. All rights reserved.