mysql - 一个过程的 CALL 不断加载,占用大量 CPU,并且失败
问题描述
我正在尝试创建一个过程,该过程将采用由数千条记录组成的视图表,并通过根据各种条件删除几条记录来过滤它。
当我尝试使用 CALL 运行它时,它一直在加载,根据 WHM 面板,进程 (phpMyAdmin/import.php) 占用了大约 90% 的 CPU 功率。最终,由于超时,它可能在 10 分钟后失败:
静态分析:
分析时发现1个错误。
缺少表达。(位置 25 附近的“ON”) SQL 查询:编辑编辑
设置 FOREIGN_KEY_CHECKS = ON;
MySQL 说:文档
2006 - MySQL 服务器已经消失
我正在使用以下代码,而新的视图表正在使用 3 个 DB 表:
vw_r2_items_tr
,正在使用tr
数据库核心表,以及-vw_items
使用核心表的视图表items
visits
DELIMITER $$
CREATE VIEW `vw_r2_items_tr` AS
SELECT
IF((`i`.`id` = `t`.`item_ord`),1,0) AS `has_tr`,
`i`.`calculated_score` AS `calculated_score`,
`i`.`visited_at` AS `visited_at`,
`i`.`ip_address` AS `ip_address`,
`i`.`user_id` AS `user_id`,
`i`.`visit_id` AS `visit_id`,
`i`.`product_id` AS `product_id`,
`i`.`name` AS `name`,
`i`.`id` AS `id`,
`i`.`item_no` AS `item_no`,
FROM (`vw_items` `i`
LEFT JOIN `trs` `t`
ON (((`t`.`visit_id` = `i`.`visit_id`)
AND (`t`.`item_ord` = `i`.`id`))))$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE `vw_unique_trs2`()
BEGIN
SET @vat=0;
SET @ht=0;
SET @tdiff=0;
-- EXPLAIN
SELECT
COUNT(*) AS ct,
tb1.* FROM (SELECT it.*, @tdiff:=UNIX_TIMESTAMP(CONVERT_TZ(it.visited_at,'+00:00',@@global.time_zone)) AS tdiffs,
IF(@vat > 0 AND ((@vat-@tdiff) < 28800 AND (@vat-@tdiff) > -28800),@vat DIV 28800, @tdiff DIV 28800) AS diff,
@ht:=(IF(@vat > 0 AND ((@vat-@tdiff) < 28800 AND (@vat-@tdiff) > -28800),@ht+has_tr,has_tr)) hts,
@vat:=(IF(@vat > 0 AND ((@vat-@tdiff) < 28800 AND (@vat-@tdiff) > -28800),@vat,@tdiff)) curr_vat
FROM (SELECT * FROM (SELECT * FROM `vw_r2_items_tr` ORDER BY has_tr DESC, item_no, visited_at) AS tb
GROUP BY `tb`.`visit_id`,`tb`.`product_id`) AS it
ORDER BY has_tr DESC, it.visited_at DESC
) AS tb1
GROUP BY user_id, calculated_score, diff, hts;
END$$
DELIMITER ;
解决方案
我认为你不能只使用一个“ON”和两个连接,尝试像这样进行 2 个连接查询
`SELECT *
FROM Table1
LEFT JOIN Table2 ON Table1.key = Table2.key` and
LEFT JOIN Table3 ON Table1.key = Table2.key`
推荐阅读
- javascript - 在 Javascript 中,如何在没有时区的情况下打印出 Date 对象的日期和时间?
- google-apps-script - 导航谷歌应用脚本的最佳实践
- swiftui - 如何在 SwiftUI 中通过 lineLimit 限制 TextEditor?
- maven - 创建spring基础知识后的maven pom.xml,出现错误
- forms - KeyDown 事件:vbKeyUp、vbKeyDown 以增加表单中的日期字段而不会失去字段的焦点
- stripe-payments - 如何在 Stripe 的服务器端检查支付是否成功
- css - SASS @extend 生成的类
- go - 解析字符串以浮动货币
- javascript - Marked 不会清理 VueJS 组件中的自述文件
- typescript - 导入 OpenAPI 规范生成的类型