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.