SQL Index
Nu heb ik een grote tabel (2.000.000+ records), waarbij ik daar results uit moet halen. De laadtijd van de pagina is echter wel lang. Hoe indexeer ik deze tabel het beste zodat de laadtijd omlaag gaat?
De tabel bevat 12 kolommen:
ID (INT, AI, PRIMARY) (ID van de rij)
Domein (VARCHAR) (domeinnaam)
Datum (VARCHAR) (datum)
Tekens (INT) (aantal tekens domeinnaam)
Registratie (VARCHAR) (registratiedatum domeinnaam)
PA (DECIMAL) (score op 2 decimalen)
DA (DECIMAL) (score op 2 decimalen)
Status (VARCHAR) (bezet, quarantaine, vrij of leeg)
DMOZ (VARCHAR) (0/1, of de domeinnaam op DMOZ staat)
Pagina (INT) (pagina waarop de domeinnaam staat bij ophalen)
EditTime (DATETIME) (laatste wijziging)
Time (TIMESTAMP, CURRENT_TIMESTAMP) (datum van toevoeging)
Ik hoor het graag om ook wat meer van indexen te leren.
Overigens: een leuke om te beginnen: http://use-the-index-luke.com/
Gewijzigd op 21/05/2016 15:49:28 door Ben van Velzen
Ik voer dit soort queries uit:
(SELECT)
- SELECT COUNT(ID) AS cs FROM domeinen WHERE DMOZ = '' (om op te vragen hoeveel domeinen nog geen DMOZ hebben)
- SELECT * FROM domeinen WHERE Datum = '$datum' $order LIMIT $offset,100 ($datum = GET van Datum, $order = ORDER BY ..., $offset = GET van offset)
- SELECT * FROM domeinen WHERE Datum = '$datum' $order (bovenstaande, zonder limit om te kunnen tellen hoeveel "paginas" er zijn)
- SELECT * FROM domeinen WHERE Domein LIKE '%$search%' $order LIMIT $offset,100
(UPDATE)
- UPDATE domeinen SET PA = '".mysqli_real_escape_string($con,$ct['upa'])."', DA = '".mysqli_real_escape_string($con,$ct['pda'])."' WHERE Domein = '".mysqli_real_escape_string($con,$_GET['domain'])."' AND Datum = '".mysqli_real_escape_string($con,$_GET['datum'])."' (voor het updaten van de PA/DA van een domein)
- UPDATE domeinen SET DMOZ = '$dmoz' WHERE ID = '$R->ID' (voor het updaten van de DMOZ), hier volgt eerst een SELECT voor: (SELECT ID,Domein FROM domeinen WHERE DMOZ = '' LIMIT 25).
(INSERT)
- INSERT INTO domeinen (Domein,Datum,Tekens,Registratie,Pagina) VALUES ('$dname','$datum','$tekens','$reg_datum','".$i."')
Met name de SELECT en UPDATE's duren lang, de INSERT is zo gebeurd. Ook het laden van de tabel in phpMyAdmin kost ongeveer 30 seconde, voordat ik de tabelstructuur in kan. Er is dus nog wat tijdwinst te behalen.
Heb je zo voldoende informatie om er iets over te kunnen zeggen? Die website zal ik eens bekijken.
De zoekfunctie zal nooit snel worden, De LIKE constructie is niet indexeerbaar. Maar je kunt beginnen met een index op Datum en DMOZ.
Daarop mijn volgende vraag: Wat is precies een "INDEX"? Is daarvoor het knopje "index" in phpMyAdmin bij de kolom aanklikken voldoende, of moet ik daar meer voor doen?
Ik heb je leesvoer gegeven, daar staat precies in wat een index is, hoe je ze gebruikt etc. phpMyAdmin is een rotproduct waar ik voor mijn verdriet nog niet mee werk, maar het komt neer op "als de CREATE INDEX query gedraaid is bestaat je index".
Top, dank voor je hulp, ik ga me erin verdiepen!