J'essaie depuis 4 semaines de comprendre pourquoi les requêtes s'exécutent par intermittence pour toujours sur Docker Mysql Percona Distribution (percona:8.0.32-24, vide my.cnf). Cette requête postscript est exécutée après l'importation de plusieurs CSV générés à l'aide de l'algorithme d'exploration de données de MySQL Shell. La moitié du temps, il s’exécute avec succès en 2 à 3 secondes.
Sinon, même si le nombre rows_inserted correct est affiché, il s'arrête et entre dans uneboucle infinie(2+ jours) etcontinue d'augmenter le nombre rows_fetched(fig1.png) . Pourquoi cette requête prend-elle autant de temps à s'exécuter et pourquoi lit-elle la table sans fin (high 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
** Insérez 2 métriques (confiance et support) avant l'exécution de la requête :
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';
Le même comportement est observé sans INSERT.
Voir la déclaration explicative (fig3.png). Lorsqu'une boucle infinie se produit, on observe ce qui suit :
显示进程列表
:查询被标记为status =“执行”
.
显示引擎innodb状态
: Requête introuvable dans la section transaction.
select * from sys.schema_table_statistics WHERE table_schema = 'DB_NAME'
La sortie de rows_fetched semble croître à l'infini. (voir fig1.png ne fonctionne pas, fig4.png fonctionne, tous deux exécutés sur les mêmes données).
Toute aide ou idée pourrait sauver une vie.
Mettre
值
à la fin du PK :Veuillez noter qu'il en va de même pour
322
来自 2+4*80,这意味着它仅使用一列。 (const
. )Cela ne signifie pas que la totalité des 322 octets sont alloués, mais c'est le "pire des cas".