Seite 1 von 1

Simple SQL-Abfrage langsam trotz INDEX

Verfasst: 17.01.2008 20:24
von mgutt
Hi,

hier die Abfrage:
SELECT search_kw
FROM phpbb_search_keywords
WHERE forum_location = 'www.maxrev.de'
ORDER BY search_tries DESC
LIMIT 100
Die braucht im Schnitt 6 Sekunden.

So braucht sie nur 0,0001:
SELECT search_kw
FROM phpbb_search_keywords
ORDER BY search_tries DESC
LIMIT 100
Ich weiß, dass es ziemlich suboptimal ist, mit Strings zu vergleichen, aber auf forum_location ist ein Index und ich verstehe nicht, warum das sogar gar keine Verbesserung resultierte, als ich den Index gesetzt habe.

Derzeit umfasst die Tabelle ca. 500.000 Zeilen.

Wenn das wirkich so viel ausmacht, dann stelle ich das ganze Projekt so um, dass es nur noch IDs vergleicht, aber das das so viel ausmacht hätte ich echt nicht gedacht.

Gruß

Verfasst: 17.01.2008 21:17
von Seether
Habe zumindest bei mir lokal ein ähnliches Problem.

Aus einer 300k Zeilen Tabelle nehme ich einen Wert und verändere die Zeile einer 600k Zeilen tabelle bei der Zeile mit dem Wert aus Tabelle 1.
In 60 Sekunden schaffe ich gerade mal 170 Zeilen so abzufragen ...

Verfasst: 17.01.2008 22:17
von mgutt
Ist der Vergleichswert eine ID oder ein String (z.B. VARCHAR)? Hast Du auf dem Vergleichswert einen Index gesetzt?

Ich habe mal einen Test gemacht mit einer vollen Tabelle.. also ca. 50 Millionen Zeilen oder so. Eben bis 4 GB, also das Maximum einer Tabelle erreicht war. Da war ein string = suchwort nicht mehr machbar. Nach 10 Minuten hat der MySQL Dienst immer schlapp gemacht.

Ich glaube ab einer gewissen Zeilengröße gehen nur noch IDs und wenn die erreicht ist, dann sollte man wohl mit mehreren Tabellen arbeiten.

Gruß

Verfasst: 18.01.2008 21:39
von mgutt
Ok zurück zu mir :D

Ich habe es auf IDs geändert und konnte das Problem zumindest analysieren. Also die Abfrage:

Code: Alles auswählen

SELECT search_kw
FROM phpbb_search_keywords
WHERE host_id =1
ORDER BY search_tries DESC 
LIMIT 100
War schnell sobald ich KEINEN Index auf host_id hatte. Sobald einer vorhanden ist, dauert die Abfrage bis zu 10 Sekunden.

Anscheinend verhalten sich INDEX Spalten doch anders als ich dachte. Jemand eine Erklärung dazu?