Philipp Hasenfratz: SQL-Abfrage zwingt Server in die Knie

Beitrag lesen

Halihallo mo

Das liegt bei der kleinen Datenmenge sicher nicht an MySQL, sondern am Server....
Jo....eher an der Abrfrage, schon klar.

Entweder die, oder der Rechner, der etwas spinnt ;)

LIKE '%...%' sind absolute Performancefresser, derartige Konstruktur erfodern einen
Full Table Scan => jeden einzelnen Record durchforsten. Wenn es die Aufgabestellung
ermöglicht, ist LIKE '...%' (ohne erstes %) mit Index tausendmal effizienter....
Hab schon Indexe über die zu durchsuchenden Spalten gelgt, hat aber nix gebracht. Das '%Suchbegriff%' ist notwendig, da bei der eingabe von 'meier' auch Spalten mit 'Obermeier' oder 'Meierhofer' ausgegeben werden sollen.

Die Indizies brauchen in diesem Fall nur Speicher, wenn du die gegebenen LIKE Konstrukte
weiterverwendest. Der Index kann nicht verwendet werden.

Kannst auch versuchen mit temporären Tabellen zu arbeiten (Speicherung aber dennoch
auf Platte). Beide Tabellen in eine schreiben, sodass die Datenbank keinen JOIN berechnen
muss (MySQL versucht die Daten erst im RAM-Speicher zu halten), damit verbrauchst du
weniger RAM-Speicher, aber mehr Performance (kommt eben darauf an, _was_ die DB in die
Knie zwingt)......
Wie arbeitet man mit temporären Tabellen?
Das habe ich nun noch nie gemacht

Temporär war vielleicht missverständlich. Kannst dich doch mal über HEAP-Tables
unter www.MySQL.com informieren. Ich dachte aber daran, dass du eine ganz "normale"
Tabelle erstellst, und dort alle Datensätze speicherst; somit muss MySQL keinen
JOIN bilden. Ich bin mir jedoch nicht sicher, inwieweit MySQL bereits optimiert.

EXPLAIN SELECT <dein-query>

wenn er hier nicht abstürtzt, kann dir der Befehl nützliche Informationen bringen.

---

Arbeitest du mit einer Programmiersprache zusammen? - Dann könntest du mehrere
Unterabfragen (was sonst über Subselects ginge, jedoch nicht in MySQL) getrennt ausführen
und so die Last verteilen.

---

Grundsätzlich: Du musst ein Ziel verfolgen: Die Datenmenge möglichst schnell, möglichst
klein werden zu lassen (durch geeignete Kriterien); normalerweise versucht dies die
Datenbank automatisch, aber du scheinst hier etwas nachhelfen zu müssen. Deswegen mein
obiger Vorschlag auf eine Programmiersprache auszuweichen und mehrere Queries
auszuführen. Somit kannst du die Menge passender Datensätze schrittweise verkleinern
und die Datenbank muss nicht alles auf einmal durchsuchen. Geht zwar auf Kosten der
Performance, dafür funktioniert es vielleicht.

Viele Grüsse

Philipp