sql >> Databasteknik >  >> RDS >> Mysql

Mysql samma frågar en med index sekund utan att få 10000xFetch tid?

OR UPPER(lu.opis) LIKE UPPER('%SomeName%')

har 3 prestandaproblem:

  • OR är dåligt optimerad. I huvudsak måste tabellen skannas för att kontrollera alla rader. Index kommer sannolikt inte att hjälpa.
  • UPPER(indexed-column) förhindrar att ett index används i den kolumnen. Detta är lätt att komma runt att förklara att kolumnen har en COLLATION som är "skiftlägesokänslig" -- det vill säga något som utf8_unicode_ci; notera _ci .
  • LIKE '%... kan inte använda ett index på grund av ledande jokertecken.

Dessutom brukar det vara dumt att ha

32497 row(s) returned

Vad ska du göra med så många rader? Nätverksöverföringstiden kommer att vara betydande, även om själva frågan inte är det.

För att "lösa" LIKE , OR och UPPER problem på en gång, samla ihop texten till en enda kolumn i en enda tabell. Ange sedan en FULLTEXT index på den kolumnen. Den, MATCH ... AGAINST ... kommer att köras mycket snabbare -- åtminstone för att göra SomeName Sök. (LEFT JOINs är en annan sak.)




  1. Kan en MySQL SELECT-sats fungera utan att ange kolumnnamn?

  2. 12 vanliga SQL-operatorer

  3. Hur clock_timestamp() fungerar i PostgreSQL

  4. Felaktig användning av rumsligt/fulltext/hashindex och explicit indexordning på MySQL 8.0.11