sql >> Databáze >  >> RDS >> Mysql

Vážné problémy s výkonem dotazů MySQL po přidání podmínky

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.




  1. Vlastnost objektu PHP obsahuje závorky

  2. MySql zobrazuje výkon

  3. Jak implementovat Materialized View s MySQL?

  4. LEFT JOIN příkaz a limit