Uveďte prosím SHOW CREATE TABLE
.
Doufám, že uvidím tyto složené indexy:
`val`: (entityId, attributeId) -- order is not critical
Bohužel, protože code
je LONGTEXT
, to u entity
není možné :INDEX(type, code, entityId)
. Proto to nebude příliš efektivní:
SELECT entityId
from entity
where code = v9.Value
and type = 97
limit 1
Vidím LIMIT
s ORDER BY
-- zajímá vás, jakou hodnotu získáte?
Asi by to bylo lepší napsat jako
WHERE EXISTS ( SELECT 1 FROM entity
WHERE entityID = e3.entityID
AND code = v9.Value
AND type = 97 )
(Jste si jisti kombinací e3
a v9
?)
Obtékání...
Toto vynutí LEFT JOIN
abyste se stali JOIN
. A zbaví se pak vnitřního ORDER BY
.
Poté se Optimalizátor pravděpodobně rozhodne, že je nejlepší začít s 68e9145e-43eb-4581-9727-4212be41bef5
, který nazývám val AS v11
:
JOIN val AS v11 ON (v11.entityId = e2.id
and v11.attributeId = 1614)
AND v11.Value = 'bar2')
Pokud se jedná o tabulku EAV, pak vše, co udělá, je ověřit, že [, 1514] má hodnotu 'bar2'. To nevypadá jako rozumný test.
kromě mého předchozího doporučení.
Preferoval bych EXPLAIN SELECT ...
.
EAV
Za předpokladu val
je tradiční EAV tabulka, toto by bylo pravděpodobně mnohem lepší:
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
Ty dvě ID nemají praktické využití (pokud mi něco nechybí). Pokud jste nuceni je používat kvůli frameworku, je to nešťastné. Povýšení (entityId, attributeId) na PK umožňuje načítání value
trochu rychleji.
Neexistuje žádný užitečný způsob, jak zahrnout LONGTEXT
v jakémkoli indexu, takže některé z mých předchozích návrhů je třeba změnit.