mysql - 如何更改 SQL 查询以使其对更大的数据集执行得更快?

标签 mysql

我无法理解我的 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/

相关文章:

mysql - 使用 Codeigniter 中两个表中的类似功能使用用户名或电子邮件进行搜索

php - 如何从 MySQL 的函数返回单个值到 PHP?

php - 从选项中显示错误答案

类中的 python 和 mysql 连接,数据库打开和关闭奇怪的行为

python - 我如何在 sqlalchemy 中表达这个查询?

java - JPA:根据实例变量动态地将实体映射到表

javascript - 使用javascript var通过php mysql查询数据

MySQL 有时会错误地为 count(*) 返回 0

mysql - 插入带条件的查询

mysql - 这样的mysql查询该怎么做呢?