【问题标题】:Optimizing query, select from many tables优化查询,多表选择
【发布时间】:2015-08-11 15:07:55
【问题描述】:

我有一个连接四个表的 SQL 脚本。我正在使用许多AND 操作。有没有办法优化这个脚本?

SELECT s.ACCESS_CODE, a.ACCESS_CODE, MIN(b.ID), b.NAME, a.USER_ID, b.PARENT_ID,b.UPDATE_TIME
FROM b_disk_simple_right s, b_user_access a, b_disk_object b, b_file f
WHERE s.ACCESS_CODE = a.ACCESS_CODE 
  AND a.USER_ID = '".$userID."' 
  AND s.OBJECT_ID=b.ID 
  AND f.ID = b.FILE_ID
  AND b.DELETED_BY=0
  AND f.MODULE_ID = 'disk' 
GROUP BY b.ID

【问题讨论】:

  • 只使用FROM 中的一张表,其余使用Joins
  • 这个查询真的很慢吗?
  • 这四个表之间是否有任何关系(通过外键或其他方式暗示)?
  • 为什么使用 MIN(b.ID) 和 GROUP BY b.ID?这与按规则进行的一般分组相反。 (如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是集合函数的参数。)
  • @John,显式 JOIN 语法对性能没有影响。

标签: mysql sql requirejs-optimizer


【解决方案1】:

尝试如下内连接:

SELECT        s.ACCESS_CODE, a.ACCESS_CODE AS Expr1, MIN(b.ID) AS Expr2, b.NAME, a.USER_ID, b.PARENT_ID, b.UPDATE_TIME
FROM          b_disk_simple_right AS s INNER JOIN
              b_user_access AS a ON s.ACCESS_CODE = a.ACCESS_CODE CROSS JOIN
              b_disk_object AS b CROSS JOIN
              b_file AS f
WHERE        (a.USER_ID = '".$userID."') AND (s.OBJECT_ID = b.ID) AND (f.ID = b.FILE_ID) AND (b.DELETED_BY = 0) AND (f.MODULE_ID = 'disk')
GROUP BY b.ID

【讨论】:

    【解决方案2】:

    首先,您应该了解此操作是否实际上限制了您的应用程序的速度。如果不是,那么它可能是not worth worrying about。最后,在不更改架构或索引的情况下,您不会从中榨取更多(体面的数据库系统会在运行之前为您优化它)。

    【讨论】:

      猜你喜欢
      • 2017-02-08
      • 2011-04-11
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      相关资源
      最近更新 更多