Mysql
 sql >> Base de données >  >> RDS >> Mysql

Problèmes graves de performances des requêtes MySQL après l'ajout d'une condition

Veuillez fournir SHOW CREATE TABLE .

J'espère voir ces index composites :

`val`: (entityId, attributeId)   -- order is not critical

Hélas, car code est LONGTEXT , ce n'est pas possible pour entity :INDEX(type, code, entityId) . Cela ne sera donc pas très efficace :

        SELECT  entityId
            from  entity
            where  code = v9.Value
              and  type = 97
            limit  1

Je vois LIMIT avec un ORDER BY -- vous souciez-vous de la valeur que vous obtenez ?

Ce serait probablement mieux écrit comme

    WHERE EXISTS ( SELECT 1 FROM entity
                WHERE entityID = e3.entityID
                  AND code     = v9.Value
                  AND type = 97 )

(Êtes-vous sûr du mélange de e3 et v9 ?)

Emballage...

Cela force le LEFT JOIN devenir JOIN . Et il se débarrasse du ORDER BY alors interne .

Ensuite, l'optimiseur décide probablement qu'il est préférable de commencer par 68e9145e-43eb-4581-9727-4212be41bef5 , que j'appelle val AS v11 :

JOIN val AS v11 ON (v11.entityId = e2.id
             and  v11.attributeId = 1614)
             AND  v11.Value = 'bar2')

S'il s'agit d'une table EAV, tout ce qu'elle fait est de vérifier que [, 1514] a la valeur 'bar2'. Cela ne semble pas être un test judicieux.

en plus de ma précédente recommandation.

Je préférerais EXPLAIN SELECT ... .

EAV

En supposant val est une table EAV traditionnelle, ce serait probablement bien mieux :

CREATE TABLE `val` (
  `attributeId` int(11) NOT NULL,
  `entityId` int(11) NOT NULL,
  `Value` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
  PRIMARY KEY(`entityId`,`attributeId`),
  KEY `IX_val_attributeId` (`attributeId`),
) ENGINE=InnoDB AUTO_INCREMENT=2325375 DEFAULT CHARSET=latin1

Les deux identifiants n'ont aucune utilité pratique (à moins qu'il ne me manque quelque chose). Si vous êtes obligé de les utiliser à cause d'un framework, c'est dommage. Promouvoir (entityId, attributeId) en tant que PK rend la récupération de value un peu plus vite.

Il n'y a aucun moyen utile d'inclure un LONGTEXT dans n'importe quel index, certaines de mes suggestions précédentes doivent donc être modifiées.