sql >> Database >  >> RDS >> Mysql

Mysql dezelfde query's een met index seconde zonder 10000xFetch-tijd te krijgen?

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

heeft 3 prestatieproblemen:

  • OR is slecht geoptimaliseerd. In wezen moet de tabel worden gescand om alle rijen te controleren. Indexen zullen waarschijnlijk niet helpen.
  • UPPER(indexed-column) voorkomt het gebruik van een index op die kolom. Dit is gemakkelijk te omzeilen door die kolom een ​​COLLATION te geven dat is "hoofdlettergevoelig" -- dat wil zeggen, zoiets als utf8_unicode_ci; let op de _ci .
  • LIKE '%... kan geen index gebruiken vanwege de voorloop jokerteken.

Bovendien is het meestal dwaas om

32497 row(s) returned

Wat ga je doen met zoveel rijen? De netwerkoverdrachtstijd zal aanzienlijk zijn, zelfs als de zoekopdracht zelf dat niet is.

Om de LIKE . op te lossen , OR , en UPPER problemen allemaal tegelijk, verzamel de tekst samen in een enkele kolom in een enkele tabel. Geef dan een FULLTEXT index op die kolom. De, MATCH ... AGAINST ... zal een stuk sneller werken -- tenminste voor het uitvoeren van de SomeName zoeken. (De LEFT JOINs zijn een andere zaak.)




  1. Mysql-join geeft dubbele rijen

  2. Trigger herkent tabel niet (Trigger om inhoud van NEW.values ​​op te splitsen in meerdere rijen om in een andere tabel in te voegen)

  3. MYSQL:SELECT-methode - maar laat geen duplicaten / GROUP of DISTINCT zien?

  4. Envers + MYSQL + List<String> =SQLSyntaxErrorException:Opgegeven sleutel was te lang;