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.