这是我的查询:(它需要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_transactions
和club_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在表上更新表的统计信息