为什么调用一个查询作为一个视图需要很多额外的时间来执行?



这是我的查询:(它需要0.01秒)被执行:

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秒执行。真的吗?为什么我如何优化它?


EXPLAIN的结果:

输入图片描述

  • 3秒280K行-不错。

  • 0.01秒280K行—听起来像是打开了查询缓存,它查找结果而没有实际评估它。在每个SELECT之后立即添加SQL_NO_CACHE后重新计时。

  • 第一个SELECT没有过滤,所以它有义务获取280K行。

  • pos_transactionsclub_transactions似乎几乎相同。我建议您将它们合并到单个transactions表中。这可能会帮助优化器做得更好。

为了进一步讨论,请提供每个表的SHOW CREATE TABLE,表的大小。

解释

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

一个可能的原因是查询缓存,尝试禁用它,看看它是否解决了这个问题。
另一个原因可能是视图优化导致使用临时表,从而导致速度变慢。

确保在

上有索引
  • pos_transactions.business_id
  • businesses.sub_category_id
  • pos_transactions.psp_id
  • club_transactions.business_id
  • club_transactions.status

如果你有索引。你可以试着运行ANALYZE TABLEtable_names在表上更新表的统计信息

最新更新