首页 > 解决方案 > 为什么将查询作为视图调用需要大量额外的时间来执行?

问题描述

这是我的查询:(需要0.01sec)执行:

SELECT `pos_transactions`.`id`, 
       `psps`.`name` psp_or_club_name, 
        businesses.discount, 
        shop_name, 
        businesses.city_id, 
       `amount`,
       `transaction_date`, 
       `psp_id` , 
       `business_id`, 
       'pos' as `name`, 
       `daily_percentage`
FROM `pos_transactions`       
JOIN `businesses` 
  ON `business_id` = `businesses`.`id`
JOIN `business_sub_categories` 
  ON `businesses`.`sub_category_id` = `business_sub_categories`.`id`
LEFT JOIN `psps`  
  ON `psp_id` = `psps`.`id`

UNION ALL

SELECT `club_transactions`.`id`, 
       `clubs`.`name_fa`,
        psp_or_club_name, 
        businesses.discount,
        shop_name, 
        businesses.city_id,
       `amount`,
       `transaction_date`,
       `club_transactions`.`club_id` as `psp_id` ,
       `business_id`, 
       'club' as `name`, 
       `daily_percentage` 
FROM `club_transactions`
JOIN `businesses` 
  ON `business_id` = `businesses`.`id`
JOIN `business_sub_categories` 
  ON `businesses`.`sub_category_id` = `business_sub_categories`.`id`
LEFT JOIN `clubs`  
  ON `club_transactions`.`club_id` = `clubs`.`id`
where `club_transactions`.`status` = "paid"

我需要制作view它,他们在不同的地方调用它。所以我以这种方式创建视图:

CREATE VIEW myview AS ( <query above> )

然后像这样使用它:

SELECT * FROM myview 

3执行需要 sec。为什么真的?我该如何优化它?


这是结果EXPLAIN

在此处输入图像描述

标签: mysqlsqlperformancesql-view

解决方案


  • 280K 行需要 3 秒——还不错。

  • 280K 行需要 0.01 秒——听起来查询缓存已打开,它在没有实际评估的情况下查找结果。SQL_NO_CACHE每次添加后立即重新计时SELECT

  • 第一个SELECT没有过滤,因此它必须获取 280K 行。

  • pos_transactions并且club_transactions似乎几乎相同。我建议您将它们组合成一个transactions表。这可能会帮助优化器做得更好。

如需进一步讨论,请提供SHOW CREATE TABLE每张桌子的桌子尺寸。

说明

0.01 秒是假的!LIMIT 24UI在运行之前附加到查询上。这让它在完成所有工作之前停止,因此跑得很快。


推荐阅读