Indexen kunnen een belangrijke rol spelen bij het optimaliseren van zoekopdrachten en het snel doorzoeken van de resultaten in tabellen. Het is dus de belangrijkste stap om te selecteren welke kolommen moeten worden geïndexeerd. Er zijn twee belangrijke plaatsen waar we indexering kunnen overwegen:kolommen waarnaar wordt verwezen in de WHERE-clausule en kolommen die worden gebruikt in JOIN-clausules. Kortom, dergelijke kolommen moeten worden geïndexeerd waartegen u bepaalde records moet zoeken. Stel dat we een tabel hebben met de naam kopers waarin de SELECT-query indexen gebruikt zoals hieronder:
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 */
Aangezien er naar "buyer_id" wordt verwezen in het SELECT-gedeelte, zal MySQL het niet gebruiken om de gekozen rijen te beperken. Er is dus geen grote noodzaak om het te indexeren. Het onderstaande is een ander voorbeeld dat weinig verschilt van het bovenstaande:
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 */
Volgens de bovenstaande query's voornaam, achternaamkolommen kunnen worden geïndexeerd zoals ze zich in de WHERE-component bevinden. Ook een extra veld, country_id uit de landentabel, kan worden overwogen voor indexering omdat het in een JOIN-clausule staat. Dus indexering kan worden overwogen op elk veld in de WHERE-clausule of een JOIN-clausule.
De volgende lijst biedt ook enkele tips die u altijd in gedachten moet houden wanneer u indexen in uw tabellen wilt maken:
- Indexeer alleen de kolommen die vereist zijn in de WHERE- en ORDER BY-clausules. Het veelvuldig indexeren van kolommen zal enkele nadelen met zich meebrengen.
- Probeer te profiteren van de "index prefix" of "multi-columns index" functie van MySQL. Als u een index maakt zoals INDEX(first_name, last_name), maak dan geen INDEX(first_name) aan. "index prefix" of "multi-columns index" wordt echter niet in alle zoekgevallen aanbevolen.
- Gebruik het NOT NULL-attribuut voor die kolommen waarin u de indexering overweegt, zodat NULL-waarden nooit worden opgeslagen.
- Gebruik de optie --log-long-format om query's te loggen die geen indexen gebruiken. Op deze manier kunt u dit logbestand bekijken en uw zoekopdrachten dienovereenkomstig aanpassen.
- Het EXPLAIN-statement helpt je te laten zien hoe MySQL een query zal uitvoeren. Het laat zien hoe en in welke volgorde tabellen worden samengevoegd. Dit kan erg handig zijn om te bepalen hoe geoptimaliseerde zoekopdrachten moeten worden geschreven en of de kolommen moeten worden geïndexeerd.
Update (23 feb'15):
Elke index (goed/slecht) verhoogt de invoeg- en updatetijd.
Afhankelijk van uw indexen (aantal indexen en type) wordt er naar resultaat gezocht. Als je zoektijd gaat toenemen vanwege index, dan is dat een slechte index.
Zoals in elk boek kan een "Indexpagina" een startpagina van een hoofdstuk, een paginanummer van een onderwerp en ook een pagina met een subonderwerp hebben. Enige verduidelijking op de Index-pagina helpt, maar een meer gedetailleerde index kan u verwarren of bang maken. Indexen hebben ook geheugen.
Indexselectie moet verstandig zijn. Houd er rekening mee dat niet alle kolommen index vereisen.