sql >> Database >  >> RDS >> Mysql

MYSQL-database-optimalisatie met behulp van indexering

Wat betreft de indexvragen:een index is niet alleen wenselijk, maar ook nodig om dingen te "versnellen". Zoals ik het begrijp (in "leken"-termen), is de functie van een index om zoekopdrachten en herstel van gegevens in een tabel te versnellen.

Redenen om indexen te gebruiken:

  1. Identificeer elke rij op elke tabel uniek (de primaire sleutel is tenslotte een index)
  2. De indexen zijn gesorteerd (zelfs als de gegevens dat niet zijn)
  3. Versnel zoekopdrachten en filters:een index maakt het herstel van gegevens sneller, omdat het de plaatsing van de gegevens in de tabel "vasthoudt" (het "lokaliseert" de gegevens die u wilt herstellen). Het maakt het ook gemakkelijker voor de database-engine om de gegevens te filteren (het is altijd sneller en eenvoudiger om gesorteerd te filteren gegevens dan gecodeerd gegevens)
  4. Optimaliseer de manier waarop gegevens worden hersteld bij het gebruik van gerelateerde tabellen:elke externe sleutel moet worden geïndexeerd om de zoekopdrachten die betrekking hebben op primaire - externe sleutelrelaties te versnellen

Enkele "duimregels" die ik gebruik om te beslissen welke velden moeten worden geïndexeerd:

  • Elke primaire sleutel wordt geïndexeerd (de duidelijke één:een primaire sleutel moet uniek zijn en mag niet null zijn)
  • Elke externe sleutel moet worden geïndexeerd (om de relaties tussen primaire en externe sleutels efficiënt te maken)
  • Elk numeriek of datumveld waarop ik zoekacties moet uitvoeren, moet worden geïndexeerd. Dat gezegd hebbende, probeer ik double te vermijden (of een ander numeriek type met drijvende komma) die moeten worden geïndexeerd, omdat ze over het algemeen worden gebruikt om waarden op te slaan die niet bedoeld zijn om te doorzoeken.
  • Elke char of varchar veld waarop ik zoekopdrachten moet uitvoeren, moet worden geïndexeerd. Probeer indexen op text te vermijden velden, omdat ze zeer grote waarden kunnen bevatten.
  • Vermijd binair indexeren (blob ) velden... het slaat nergens op
  • Niet doen val in de verleiding om alles te indexeren. Neem de tijd om te beslissen welke velden moeten worden geïndexeerd en welke velden niet worden geïndexeerd.


  1. Een SQL Server Agent-taak uitvoeren met T-SQL

  2. Oracle SQL Where-clausule om datumrecords ouder dan 30 dagen te vinden

  3. Als PostgreSQL count(*) altijd traag is, hoe moet u dan complexe query's pagineren?

  4. Docker kan applicatie niet verbinden met MySQL