Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何优化下面的查询_Mysql_Sql_Optimization_Query Optimization - Fatal编程技术网

Mysql 如何优化下面的查询

Mysql 如何优化下面的查询,mysql,sql,optimization,query-optimization,Mysql,Sql,Optimization,Query Optimization,下面是解释 您是盲目编制索引还是首先检查了执行计划CASE..END子句帮助很大,但有时可能会扰乱执行计划。检查它可以帮助你理解我在说什么。一个选项是创建一个存储过程,并在较小的查询上拆分此查询。有时子查询是有帮助的,这是另一个可以尝试的选项。“使用临时;使用文件排序”通常意味着在查询计划的这一点上,mysql决定将临时集写入磁盘,不幸的是,这意味着它不总是能够使用您可能放在相关列上的索引 根据我的经验,唯一的解决办法是尝试减少中期结果的设置大小。尝试并隔离出现这种情况的点:例如:用COUNT(

下面是解释

您是盲目编制索引还是首先检查了执行计划
CASE..END
子句帮助很大,但有时可能会扰乱执行计划。检查它可以帮助你理解我在说什么。一个选项是创建一个存储过程,并在较小的查询上拆分此查询。有时子查询是有帮助的,这是另一个可以尝试的选项。

“使用临时;使用文件排序”
通常意味着在查询计划的这一点上,mysql决定将临时集写入磁盘,不幸的是,这意味着它不总是能够使用您可能放在相关列上的索引

根据我的经验,唯一的解决办法是尝试减少中期结果的设置大小。尝试并隔离出现这种情况的点:例如:用
COUNT(*)
替换整个
SELECT
,以消除大小写位等,然后查看是什么产生了MySql想要在磁盘上“缓存”的2779行


有关更多信息,请参阅。

我做了索引,没有为meIs工作。是否需要将其保存在一个查询中?不!在我的工作中,优化大型查询的最佳方法是将其分为几个较小的查询。这是一个很好的链接,但它特别涉及子查询的情况,这不是这里发生的情况。我同意你的观点,但我没有指出链接作为解决方案,但是作为一个例子,
CASE..END
会打乱执行计划。是的,但它不会在不强制更改计划的情况下打乱计划。案例+子查询:是,计划可以/将要更改:案例+简单算术:不,不会。即使在sum中包含CASE:您看到的是已经被GROUP语句隔离的行。谢谢!让我试着给你回电话
SELECT
    t1.theater_id,
    sum(t2.full_sale_price * t1.full_tickets + 
        t2.half_sale_price * t1.half_tickets) as Gross,
    sum(t2.full_cost_price * t1.full_tickets +
        t2.half_cost_price * t1.half_tickets) as Cost,
    Round(sum((t2.full_sale_price * t1.full_tickets + 
               t2.half_sale_price * t1.half_tickets) * t3.rate) / 100,
         2) as IPG,
         (sum(t2.full_sale_price * t1.full_tickets + 
              t2.half_sale_price * t1.half_tickets) 
              - Round(sum((t2.full_sale_price * t1.full_tickets + 
              t2.half_sale_price * t1.half_tickets) * (CASE
                WHEN ISNULL(t3.rate) THEN 0
                ELSE t3.rate
                END)) / 100,
            2)) as NetRev,
    CASE
        WHEN (t1.method = '2') THEN sum(0.00)
        ELSE 0
    END as sms,
    sum((CASE
        WHEN (t4.type = '1') THEN ((t1.full_tickets * 2) + (t1.half_tickets))
        ELSE (t1.full_tickets + t1.half_tickets)
    END) * 4.00) as maintenance,
    sum((((t2.full_sale_price * t1.full_tickets + 
           t2.half_sale_price * t1.half_tickets) 
           - (Round((t2.full_sale_price * t1.full_tickets + 
                     t2.half_sale_price * t1.half_tickets) * (CASE
                WHEN ISNULL(t3.rate) THEN 0
                ELSE t3.rate
            END) / 100,
            2))) - (t2.full_cost_price * t1.full_tickets + 
                    t2.half_cost_price * t1.half_tickets)) 
                    - (CASE
                       WHEN (t1.method = '2') THEN 0.00
                       ELSE 0
                       END) 
                    - (CASE
                       WHEN (t4.type = '1') THEN ((t1.full_tickets * 2) +
                                                  (t1.half_tickets))
                       ELSE (t1.full_tickets + t1.half_tickets)
    END) * 4.00) as admincost,
    sum(CASE
        WHEN (t4.type = '1') THEN ((t1.full_tickets * 2) + (t1.half_tickets))
        ELSE (t1.full_tickets + t1.half_tickets)
    END) as totTk
FROM
    `ratecard_rates` as t2 INNER JOIN
    `reservation` as t1 ON t1.movie_id = t2.movie_id
        AND t1.theater_id = t2.theater_id
        AND t1.showtime_id = t2.showtime_id
        AND t1.category_id = t2.category_id
        AND t1.bx_date = t2.date_apply
        LEFT JOIN
    `paymentgateway` as t3 ON t1.paymentgateway_id = t3.id
        LEFT JOIN
    `theatercategories` as t4 ON t1.category_id = t4.id
WHERE
    t1.status = '1' AND t1.method = '1'
        AND t1.reservation_type = '1'
        AND DATE(`tx_date`) BETWEEN DATE('2012-08-27') AND DATE('2012-08-27')
GROUP BY t1.theater_id