mysql - 为什么将查询作为视图调用需要大量额外的时间来执行?
问题描述
这是我的查询:(需要0.01
sec)执行:
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
:
解决方案
280K 行需要 3 秒——还不错。
280K 行需要 0.01 秒——听起来查询缓存已打开,它在没有实际评估的情况下查找结果。
SQL_NO_CACHE
每次添加后立即重新计时SELECT
。第一个
SELECT
没有过滤,因此它必须获取 280K 行。pos_transactions
并且club_transactions
似乎几乎相同。我建议您将它们组合成一个transactions
表。这可能会帮助优化器做得更好。
如需进一步讨论,请提供SHOW CREATE TABLE
每张桌子的桌子尺寸。
说明
0.01 秒是假的!LIMIT 24
UI在运行之前附加到查询上。这让它在完成所有工作之前停止,因此跑得很快。
推荐阅读
- openstack - Ubuntu 上的 OpenStack 多节点网络配置
- html - 在Firefox的打印中隐藏日期选择器中的清除按钮
- c# - 将 HttpContext 请求内容数据复制到新请求
- aerospike - Aerospike 集群在不同一致性模式下的行为?
- testing - 具有多个断言和报告的 Clojure 测试
- python - MySQL连接器Python变量未注册
- database - 我可以根据 Facebook 组中的成员身份授权数据库访问吗
- c - GtkDialog 映射没有临时父级。这是不鼓励的
- python - Visual Studio、OpenCV、Python - 应用程序中没有网络摄像头
- java - 线程“主”java.lang.NoClassDefFoundError 中的异常:org/apache/hadoop/fs/StreamCapabilities。没有版本问题