【问题标题】:Speeding up query execution in MySql加快 MySql 中的查询执行
【发布时间】:2014-02-26 11:55:34
【问题描述】:

我正在尝试在 MySql 中执行此查询:

SELECT areamaster.areaname, 
       builtydetails.builtycode, 
       builtydetails.builtyno, 
       builtydetails.builtydate, 
       builtydetails.pvtmarks, 
       areamaster_to.areaname, 
       stockview.pkgs, 
       stockview.state, 
       areamaster_from.areaname, 
       builtydetails.actualweight, 
       builtydetails.chargedweight, 
       consigner.customername, 
       consignee.customername, 
       stockview.calc, 
       stockview.stockdate 
FROM   (((((designpl_snps.stockview stockview 
            INNER JOIN designpl_snps.areamaster areamaster 
                    ON stockview.location = areamaster.areacode) 
           INNER JOIN designpl_snps.builtydetails builtydetails 
                   ON stockview.builtycode = builtydetails.builtycode) 
          INNER JOIN designpl_snps.areamaster areamaster_to 
                  ON builtydetails.toloc = areamaster_to.areacode) 
         INNER JOIN designpl_snps.areamaster areamaster_from 
                 ON builtydetails.fromloc = areamaster_from.areacode) 
        INNER JOIN designpl_snps.customermaster consigner 
                ON builtydetails.customercode = consigner.customercode) 
       INNER JOIN designpl_snps.customermaster consignee 
               ON builtydetails.customercode_consignee = consignee.customercode 
ORDER  BY areamaster.areaname, 
          builtydetails.builtycode  

但这需要很长时间才能执行。有哪些方法和技巧可以使这个或任何其他 mysql 查询更快地工作?

【问题讨论】:

  • 在连接中使用索引并按列排序
  • 你没有过滤数据,所以这个查询可能返回了很多数据。返回了多少数据?性能问题可能仅仅是由于您的查询返回的数据量。
  • 在此查询上使用 EXPLAIN 并发布结果以查看正在使用的索引。但是如果有大量数据,如果没有任何东西来缩小返回的行,这个 SQL 会很慢。

标签: mysql performance


【解决方案1】:

在 MySQL 中,这不是一件容易的事。我不知道像 MSSQL 这样的查询分析工具。也许你可以用 mtop 试试。关于这个主题还有另一个好帖子:Best MySQL performance tuning tool?

尝试将您的查询放在 VIEW 中。因为mysql缓存了查询的结果。这意味着,第一次查询需要更长的时间,之后会加快速度,因为服务器不需要执行整个查询。

另一个选项是 EXPLAIN 命令,请参见此处:http://www.sitepoint.com/using-explain-to-write-better-mysql-queries/

希望对你有帮助

干杯

【讨论】:

    【解决方案2】:

    (1) :您应该在连接中使用索引并按列排序

    (2) : 尝试使用where 而不是inner join。 Where 子句将带来比inner join 更快的结果。

    SELECT areamaster.areaname, 
           builtydetails.builtycode, 
           builtydetails.builtyno, 
           builtydetails.builtydate, 
           builtydetails.pvtmarks, 
           areamaster_to.areaname, 
           stockview.pkgs, 
           stockview.state, 
           areamaster_from.areaname, 
           builtydetails.actualweight, 
           builtydetails.chargedweight, 
           consigner.customername, 
           consignee.customername, 
           stockview.calc, 
           stockview.stockdate 
    FROM   designpl_snps.stockview stockview ,
           designpl_snps.areamaster areamaster ,
           designpl_snps.builtydetails builtydetails ,
           designpl_snps.areamaster areamaster_to ,
           designpl_snps.areamaster areamaster_from ,
           designpl_snps.customermaster consigner ,
           designpl_snps.customermaster consignee 
    
     WHERE
    
      stockview.location = areamaster.areacode and 
      stockview.builtycode =   builtydetails.builtycode and 
      builtydetails.toloc = areamaster_to.areacode and 
      builtydetails.fromloc = areamaster_from.areacode and 
      builtydetails.customercode = consigner.customercode and  
      builtydetails.customercode_consignee = consignee.customercode 
    
    ORDER  BY areamaster.areaname, 
              builtydetails.builtycode 
    

    【讨论】:

    • 此建议不准确。不要在 WHERE 子句中使用隐式连接;使用显式连接语法。这似乎是一个足够重要的原则,可以全部大写。
    • @GordonLinoff 你能举一个在 mysql 中使用显式连接的例子吗?
    • 。 .问题中的原始查询写得正确。
    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多