【问题标题】:MySQL query optimization 5MySQL查询优化5
【发布时间】:2017-10-21 13:36:30
【问题描述】:

我正在使用 JAVA + MySQL (maria db) 开发会计软件。我使用以下查询计算查询量,运行查询时查询需要 16 秒。查询持续时间正常吗?我在问题中犯了错误吗?

SELECT products_id as ID,prod_name as 'Product Name',
       IFNULL((SELECT sum(piece)
               FROM `ktgcari_000_fatura_xref` 
               WHERE product_id = ktgcari_000_stok.products_id AND
                     (type = 1 or type = 4)
              ), 0) -
       IFNULL((SELECT sum(piece)
               FROM `ktgcari_000_fatura_xref` 
               WHERE product_id = ktgcari_000_stok.products_id AND 
                     (type = 2 or type = 5)
              ), 0) +
       IFNULL((SELECT sum(piece)
               FROM ktgcari_000_ssayim 
               WHERE urun_id = ktgcari_000_stok.products_id
               ), 0) as stock
FROM ktgcari_000_stok
LIMIT 0,1000

库存=(进发票总和+进发货总和)-(发货发票总和+发货总和)+(盘点收货总和)

数据库信息: 库存卡数量:39000 发票数量:545 发票内容表数:1800 数指数:942 数据库大小:5 MB

【问题讨论】:

  • 您是否为必填字段创建了索引?

标签: mysql sql mariadb


【解决方案1】:

我会将查询写成:

SELECT s.products_id as ID, s.prod_name as `Product Name`,
       (COALESCE((SELECT SUM(CASE WHEN x.type IN (1, 4) THEN piece
                                  WHEN x.type IN (2, 5) THEN - piece
                             END)
                FROM `ktgcari_000_fatura_xref` x
                WHERE x.product_id = s.products_id AND
                      x.type IN (1, 2, 4, 5)
                  ), 0) +
        COALESCE((SELECT SUM(ss.piece)
                  FROM ktgcari_000_ssayim ss
                  WHERE ss.urun_id = s.products_id
                 )), 0
       ) as stock
FROM ktgcari_000_stok s
LIMIT 0, 1000

然后为了性能,您需要ktgcari_000_fatura_xref(product_id, type, piece)ktgcari_000_ssayim(urun_id, piece) 上的索引。

我还注意到您使用 LIMIT 而不使用 ORDER BY。您确实意识到 SQL 结果集是无序的,除非它们有明确的ORDER BY

【讨论】:

    【解决方案2】:

    我按如下方式编辑了 sql 查询。查询时间为 8 秒。我怎样才能减少持续时间。

    SELECT products_id as ID,prod_name,(SELECT IF(type=1 or type=4,sum(urun_adet),0)-IF(type=2 or type=5,sum(urun_adet),0) FROM ktgcari_000_fatura_xref哪里 product_id=ktgcari_000_stok.products_id)+IFNULL((SELECT sum(miktar) FROM ktgcari_000_ssayim 其中 urun_id=ktgcari_000_stok.products_id),0) 作为'库存' FROM ktgcari_000_stok LIMIT 0,1000

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 2011-07-07
      • 2018-12-21
      • 2010-12-15
      • 2011-11-04
      • 2016-01-25
      相关资源
      最近更新 更多