Maison  >  Questions et réponses  >  le corps du texte

MySQL - Une requête simple souffre parfois d'une boucle infinie et d'un nombre croissant de rows_fetched

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 une boucle infinie (2+ jours) et continue 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 :

Toute aide ou idée pourrait sauver une vie.

P粉022140576P粉022140576408 Il y a quelques jours578

répondre à tous(1)je répondrai

  • P粉645569197

    P粉6455691972023-09-09 00:15:17

    Mettre à la fin du PK :

    PRIMARY KEY key_rule_id (rule_id, key, value),
    KEY (key, value, rule_id)

    Veuillez noter qu'il en va de même pour 322 来自 2+4*80,这意味着它仅使用一列。 (const. )

    • Champ de longueur de 2 octets
    • Maximum 4 octets par caractère utf8mb4
    • 80 caractères dans la déclaration

    Cela ne signifie pas que la totalité des 322 octets sont alloués, mais c'est le "pire des cas".

    répondre
    0
  • Annulerrépondre