sql >> Database >  >> RDS >> Mysql

MySQL select lijkt erg traag, maar kan niet bedenken hoe te verbeteren?

Ik denk dat er wat problemen zijn met de query en de tabeldefinitie zelf.

  • Table.name is een 4K-tekenkolom
  • De zoekopdracht wordt gesorteerd op die kolom

Je sorteert op basis van een kolom waarin je strings opslaat. Om op strings te sorteren, moeten stringvergelijkingen worden uitgevoerd. Stringvergelijking is meestal een langzame bewerking en gezien de grootte van de kolom die u gebruikt, is het zeer waarschijnlijk dat dit een merkbare prestatiehit veroorzaakt.

We hebben geen indicatie van de inhoud van uw name kolom en het lijkt moeilijk om een ​​echte naam te bedenken waarvoor dat . vereist is veel karakters.

Als deze tekenreeks meerdere stukken gegevens bevat die conceptueel verschillend zijn, moet de kolom misschien worden opgesplitst in meerdere afzonderlijke kolommen, indien mogelijk, en vervolgens worden genormaliseerd zoals van toepassing.

Als je de inhoud van die kolom in meerdere kleinere kunt splitsen en die vervolgens kunt gebruiken, zouden de stringvergelijkingen, hoewel nog steeds duur, 'sneller' zijn, simpelweg omdat de strings die worden vergeleken aanzienlijk korter zullen zijn dan ze nu zijn.

Een ander ding om te overwegen is of u de zoekopdracht kunt optimaliseren door vermijden tekenreeksvergelijkingen helemaal of door het vermijden van zoekopdrachten die een volledige tabelscan veroorzaken, ondanks het feit dat u indices heeft gedefinieerd.

Daarvoor moet je kijken naar het gebruik van explain met uw vraag, zodat u een beter begrip krijgt van de Uitvoeringsplan voor query's

De documenten citeren (mijn nadruk):

Bewerk 1

Je hebt verduidelijkt dat je name kolom is eigenlijk voor gebruikersnotities. In dit geval denk ik dat je het volgende moet overwegen (in toevoeging naar wat al is genoemd):

  1. Hernoem de kolom naar iets dat overeenkomt met de werkelijke inhoud
  2. Verwijder de index uit de kolom
  3. Doe niet gebruik die kolom voor zoeken, sorteren of een andere bewerking dan alleen het selecteren om het weer te geven (het zou zeer zijn zeldzaam als het voor iets anders moet worden gebruikt, IMHO.)
  4. Overweeg desgewenst de kolom te wijzigen in een text typ en u hoeft zich niet zoveel zorgen te maken over essays van gebruikers afgekapt worden zonder waarschuwing (tenzij de GUI de gebruiker dezelfde limiet voor de invoerlengte heeft opgelegd)


  1. CakePHP:Hoe kan ik een HAVING-bewerking gebruiken bij het bouwen van query's met de zoekmethode?

  2. Deel verbinding met postgres db tussen processen in Python

  3. FIND_IN_SET() versus IN()

  4. Primaire sleutels en indexen in Hive-querytaal zijn mogelijk of niet?