sql >> Databasteknik >  >> RDS >> Sqlserver

Vilka kolumner ger generellt bra index?

Index kan spela en viktig roll vid frågeoptimering och snabb sökning av resultat från tabeller. Så det är det viktigaste steget att välja vilka kolumner som ska indexeras. Det finns två viktiga ställen där vi kan överväga att indexera:kolumner som refereras till i WHERE-satsen och kolumner som används i JOIN-satser. Kort sagt, sådana kolumner bör indexeras mot vilka du måste söka i särskilda poster. Anta att vi har en tabell med namnet köpare där SELECT-frågan använder index som nedan:

SELECT
 buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal'   /* consider to use index */

Eftersom "buyer_id" refereras till i SELECT-delen, kommer MySQL inte att använda det för att begränsa de valda raderna. Därför finns det inget stort behov av att indexera det. Nedanstående är ett annat exempel som skiljer sig lite från ovanstående:

SELECT
 buyers.buyer_id, /* no need to index */
 country.name    /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
 first_name='Tariq' /* consider to use index */
AND
 last_name='Iqbal' /* consider to use index */

Enligt ovanstående frågor first_name kan last_name-kolumner indexeras eftersom de finns i WHERE-satsen. Även ett extra fält, country_id från country-tabellen, kan övervägas för indexering eftersom det finns i en JOIN-klausul. Så indexering kan övervägas för varje fält i WHERE-satsen eller en JOIN-sats.

Följande lista ger också några tips som du alltid bör tänka på när du tänker skapa index i dina tabeller:

  • Indexera endast de kolumner som krävs i WHERE- och ORDER BY-satser. Att indexera kolumner i överflöd kommer att resultera i vissa nackdelar.
  • Försök att dra nytta av funktionen "indexprefix" eller "index med flera kolumner" i MySQL. Om du skapar ett index som INDEX(förnamn, efternamn), skapa inte INDEX(förnamn). Men "indexprefix" eller "flerkolumnsindex" rekommenderas inte i alla sökfall.
  • Använd NOT NULL-attributet för de kolumner där du överväger att indexera, så att NULL-värden aldrig lagras.
  • Använd alternativet --log-long-format för att logga frågor som inte använder index. På så sätt kan du granska den här loggfilen och justera dina frågor därefter.
  • EXPLAIN-satsen hjälper dig att avslöja hur MySQL kommer att exekvera en fråga. Den visar hur och i vilken ordning tabeller sammanfogas. Detta kan vara mycket användbart för att avgöra hur man skriver optimerade frågor och om kolumnerna behöver indexeras.

Uppdatering (23 februari 15):

Varje index (bra/dåligt) ökar insättnings- och uppdateringstiden.

Beroende på dina index (antal index och typ), söks resultatet. Om din söktid kommer att öka på grund av index är det dåligt index.

Sannolikt i vilken bok som helst kan "Indexsida" ha kapitelstartsida, ämnessidnummer börjar, även underämnessida börjar. Vissa förtydliganden på indexsidan hjälper men mer detaljerad index kan förvirra dig eller skrämma dig. Index har också minne.

Indexval bör vara klokt. Tänk på att inte alla kolumner kräver index.



  1. Hur du krypterar dina MySQL- och MariaDB-säkerhetskopier

  2. Grundläggande tabelluttryck, del 8 – CTE:er, optimeringsöverväganden fortsatte

  3. Hämta rå SQL-frågesträng från PDO-förberedda satser

  4. Enkel Slony-I replikeringsinställning.