MySQL - 简单查询有时会出现无限循环和不断增加的 rows_fetched 数量
P粉022140576
P粉022140576 2023-09-08 09:20:56
0
1
374

过去 4 周我一直在努力弄清楚为什么查询在 Docker Mysql Percona Distribution(percona:8.0.32-24,空 my.cnf)上永远间歇性地执行。此 postscript 查询在导入使用 MySQL Shell 的数据挖掘算法生成的多个 CSV 后运行。一半的时候,2-3秒就成功执行了。

否则,即使显示了正确的 rows_inserted 数量,也会停止并进入无限循环(2 天以上),并且不断增加 rows_fetched 数量 (fig1.png) 。为什么这个查询运行了这么长时间,它无休止地读取表(高 rows_fetched)是什么?

CREATE TABLE algo_rca_rule_metric (
 key varchar(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
 rule_id int unsigned NOT NULL,
 context_id int unsigned NOT NULL,
 value double NOT NULL,
 PRIMARY KEY (key,value,rule_id),
 KEY key_rule_id (rule_id,key,value)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

** 在查询运行之前插入 2 个指标(置信度和支持度):

INSERT INTO algo_rca_rule_metric
SELECT
   'confidence_order' AS 'key',
   metric_confidence.rule_id,
   metric_confidence.context_id,
   row_number() over (ORDER BY metric_confidence.value ASC, metric_support.value ASC) AS 'value'
FROM algo_rca_rule_metric metric_confidence
LEFT JOIN algo_rca_rule_metric metric_support ON (metric_confidence.rule_id = metric_support.rule_id AND metric_support.key = 'rule_support')
WHERE metric_confidence.key = 'confidence';

在没有 INSERT 的情况下观察到相同的行为。

请参阅解释语句 (fig3.png)。当无限循环发生时,会观察到以下情况:

  • 显示进程列表:查询被标记为status =“执行”

  • 显示引擎innodb状态:在事务部分找不到查询。

  • select * from sys.schema_table_statistics WHERE table_schema = 'DB_NAME' rows_fetched 输出似乎无限增长。 (参见fig1.png 不起作用,fig4.png 起作用,两者都是针对相同的数据执行的)。

任何帮助或见解都可以挽救生命。

P粉022140576
P粉022140576

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!