SQL Index

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Frank M

Frank M

21/05/2016 15:40:42
Quote Anchor link
Ik las vorige week ergens op het Forum dat het indexeren van de kolommen in een tabel (grote) impact heeft op de laadtijd, met name bij tabellen die veel records bevatten.

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.
 
PHP hulp

PHP hulp

16/11/2024 02:48:08
 
Ben van Velzen

Ben van Velzen

21/05/2016 15:47:18
Quote Anchor link
Op basis van alleen de tabel is daar niets zinnigs over te zeggen. Hoe gebruik je de tabel? Dus wat voor queries gebruik je? Waarom heb je een apart veld Tekens? Dit is toch gewoon afgeleide data?

Overigens: een leuke om te beginnen: http://use-the-index-luke.com/
Gewijzigd op 21/05/2016 15:49:28 door Ben van Velzen
 
Frank M

Frank M

21/05/2016 16:05:08
Quote Anchor link
Op elk veld, behalve de EditTime kan worden gesorteerd. Ook op het aantal tekens. Om de query te verkleinen voeg ik deze direct toe in de tabel zodra er een domeinnaam inkomt.

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.
 
Ben van Velzen

Ben van Velzen

21/05/2016 16:10:16
Quote Anchor link
De zoekfunctie zal nooit snel worden, De LIKE constructie is niet indexeerbaar. Maar je kunt beginnen met een index op Datum en DMOZ.
 
Frank M

Frank M

21/05/2016 16:17:14
Quote Anchor link
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?
 
Ben van Velzen

Ben van Velzen

21/05/2016 16:34:37
Quote Anchor link
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".
 
Frank M

Frank M

21/05/2016 16:36:37
Quote Anchor link
Top, dank voor je hulp, ik ga me erin verdiepen!
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.