mysql - 如何改进具有内部联接的 MySQL 查询

标签 mysql performance

我正在使用 MySQL DB,由于第 3 方客户端的原因,我们有一些查询需要很长时间。 “问题”是,有一个使用某些内部联接的外部选择,而没有使用“where”过滤结果,并且“where”仅位于“外部”部分,这会导致 2 个非常大的表的联接,而不是连接表的 2 个小得多的子集(我无法控制它,这是他们完成的方式...我必须定义它们连接,它们只是使用此结构向其添加 where 子句)。请注意,如果“where”子句位于内部联接中,则联接会小得多,并且整个查询会更快。

我考虑过使用 View 实现内部连接,但它会产生相同的性能。通过连接比较的所有字段都被索引。

我被告知可以通过一些数据库的配置调整来改进它,但没有人能说出具体是什么。

以下是查询的释义(执行需要花费大量秒到分钟):

SELECT a.*,
       SUM(b.p1) p1
FROM
  (SELECT a.*,
          b.p1
   FROM a
   LEFT OUTER JOIN b ON a.some_value = b.some_value)
WHERE a.some_value = 'x'

只是为了解释一下,如果我可以自己编写查询,我会这样编写(执行大约需要 200 毫秒):

SELECT a.*,
       SUM(b.p1) p1
FROM a
LEFT OUTER JOIN b ON a.some_value = b.some_value
WHERE a.some_value = 'x'

知道如何改进吗?

最佳答案

您的个人重写是可以的,但是,通过将 AND b.y 添加到 where 子句会杀死您的 LEFT 连接到 INNER JOIN。 AND b.y 应该是连接的 ON 子句的一部分,以保留左连接资格。

对于索引,表 A 应在 (x, b_id) 上有索引,表 B 在 (id, y, p1) 上有覆盖索引

关于mysql - 如何改进具有内部联接的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26098453/

相关文章:

mysql - 将所有大于 0 的选定值设置为 1 : mySQL

php - foreach 循环将数据库中的多个单选按钮填充到 php 字符串中

Android Recyclerview vs ListView with Viewholder

Mysql - 有没有更好的方法来运行大量数据的子查询?

数百个 DOM 元素的 JavaScript 事件监听器性能

java - 在 Generic DAO 中使用 Hibernate 调用存储过程的最佳方式是什么?

javascript - Mysql 在很短的时间内进行多次 INSERT

mysql - MySQL 中何时使用单引号、双引号和反引号

performance - 销售点 EMV 性能测试

sql - 性能查询 PostgreSQL