Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Problemas sérios de desempenho de consulta MySQL após adicionar condição


Forneça SHOW CREATE TABLE .

Espero ver esses índices compostos:
`val`: (entityId, attributeId)   -- order is not critical

Infelizmente, porque code é LONGTEXT , isso não é possível para entity :INDEX(type, code, entityId) . Portanto, isso não será muito eficiente:
        SELECT  entityId
            from  entity
            where  code = v9.Value
              and  type = 97
            limit  1

Vejo LIMIT com um ORDER BY -- você se importa com o valor que você recebe?

Provavelmente isso seria melhor escrito como
    WHERE EXISTS ( SELECT 1 FROM entity
                WHERE entityID = e3.entityID
                  AND code     = v9.Value
                  AND type = 97 )

(Você tem certeza sobre a mistura de e3 e v9 ?)

Invólucro...

Isso força o LEFT JOIN para se tornar JOIN . E ele se livra do ORDER BY interno então .

Então o Otimizador provavelmente decide que é melhor começar com 68e9145e-43eb-4581-9727-4212be41bef5 , que chamo de val AS v11 :
JOIN val AS v11 ON (v11.entityId = e2.id
             and  v11.attributeId = 1614)
             AND  v11.Value = 'bar2')

Se esta for uma tabela EAV, tudo o que ela faz é verificar se [, 1514] tem o valor 'bar2'. Isso não parece um teste sensato.

além da minha recomendação anterior.

Eu preferiria EXPLAIN SELECT ... .

EAV

Assumindo val é uma tabela EAV tradicional, isso provavelmente seria muito melhor:
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

Os dois IDs não têm uso prático (a menos que esteja faltando alguma coisa). Se você for forçado a usá-los por causa de uma estrutura, isso é lamentável. Promover (entityId, attributeId) para ser o PK faz a busca de value um pouco mais rápido.

Não há nenhuma maneira útil de incluir um LONGTEXT em qualquer índice, então algumas das minhas sugestões anteriores precisam ser alteradas.