Ich brauche zu beschleunigen spezifischen mysql-Abfrage auf dem großen Tisch,
Hi ich weiß es gibt viele Themen, die sich um query-Optimierung-Strategien, aber diese ist so spezifisch, ich konnte nicht die Antwort finden überall auf der interenet.
Habe ich große Tabelle von Produkt im eshop (appx. 180k Zeilen) und die Tabelle mit 65 Spalten. Ja ja ich weiß, das ist ziemlich viel, aber ich Speichere es Informationen über Bücher, dvds, bluerays und Spiele.
Bin ich noch nicht in Betracht, eine Menge von Spalten in der Abfrage, aber die Option ist immer noch ziemlich knifflig. Es gibt viele Bedingungen, die berücksichtigt werden müssen und verglichen. Abfrage unter
SELECT *
FROM products
WHERE production = 1
AND publish_on < '2012-10-23 11:10:06'
AND publish_off > '2012-10-23 11:10:06'
AND price_vat > '0.5'
AND ean <> ''
AND publisher LIKE '%Johnny Cash%'
ORDER BY bought DESC, datec DESC, quantity_storage1 DESC, quantity_storege2 DESC, quantity_storage3 DESC
LIMIT 0, 20
Ich habe auch schon versucht dort zu setzen Indizes eins zu eins auf Spalten in der where-Klausel und sogar in der order by-Klausel, dann habe ich versucht zu erstellen zusammengesetzter index auf (Produktion, publish_on, publish_off, price_vat, ean).
Abfrage ist immer noch langsam (paar Sekunden) und es müssen schnell sein, da seine eshop-Lösung und die Leute zu verlassen, da Sie nicht immer Ihre Ergebnisse schnell. Und ich bin noch nicht eingerechnet die Zeit, die ich brauche, um die Suche durchzuführen, die für alle gefundenen Zeilen, so dass ich machen kann, paging.
Ich meine, der beste Weg, um es schnell ist die Vereinfachung der Abfrage, sondern auch alle Bedingungen und Sortierung ist ein muss in diesem Fall.
Kann mir jemand helfen mit dieser Art von Problem? Ist es auch möglich, die Geschwindigkeit dieser Art der Abfrage, oder gibt es eine andere Möglichkeit, wie kann ich zum Beispiel die Vereinfachung der Abfrage und den rest auf php-engine, um die Ergebnisse zu Sortieren..
Oh, Iam wirklich ratlos in dieser.. Teilen Sie Ihre Weisheit peple, bitte...
Vielen Dank im Voraus
- nicht verwenden * verwenden Sie nur die Felder, was u wollen
- und ausführen zu erklären, um zu sehen, was passiert
- add unique-oder primary-index für Ihre Tabelle.
- poste bitte die Tabelle schema. Es ist möglich, dass Sie ein set-up, die möglicherweise profitieren von beweglichen einige Spalten auf separate Tabellen. Zweitens, poste bitte die
EXPLAIN
Abfrage. - Hast du 3 Auswahl Bedingungen und ein string-Vergleich startet mit einer wildcard und ein
ORDER BY
- Klausel. Es ist nicht verwunderlich, dass Ihre Anfrage nicht schnell. - Sie können auch einen Blick auf: ajaxline.com/32-tips-to-speed-up-your-mysql-queries
- genau, nicht nur das, sondern es gibt vier
ORDER BY
Klauseln! Brauchen wir wirklich zu sehen, das schema. DassLIKE
Klausel in es ist auch wirklich die Dinge verlangsamen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst sicher sein, was Sie möchten, um zu wählen und löschen Sie die '*'
mit etwas mehr spezifischen
Gibt es keine Verknüpfung oder etwas anderes in Ihre Tabelle, so dass der speed-up-Optionen sind ziemlich klein, denke ich.
Überprüfen, ob Ihr mysql-Server verwenden kann, genügend Arbeitsspeicher.
Haben Sie einen Blick auf diese confis in Ihrem mein.cnf
Haben Sie einen Blick auf max erlaubte Parallelität. mysql empfiehlt CPU ' s*2
thread_concurrency = 4
Sollten Sie wirklich denkt über die Aufteilung der Tabelle je nach Informationen, die Sie verwenden und auf standard-Normalisierung. Wenn es möglich ist.
Wenn es ein produktiv-system keine Möglichkeit zum splitten der Tabellen denken Sie dann an einen caching-server. Aber dies wird nur helfen, wenn Sie eine Menge von wiederkehrenden Abfragen sind die gleichen.
Dies ist, was ich tun würde, wenn Sie wissen nichts über die zugrunde liegende Implementierung oder das system überhaupt.
Bearbeiten:
Wie viele Spalten mit Wendeschneidplatten, wie Sie können, nicht unbedingt die Geschwindigkeit Ihres Systems. Je mehr Indizes ≠ mehr Geschwindigkeit.
thx an Euch alle für die guten Hinweise..
Fand ich die Lösung wahrscheinlich, weil ich war in der Lage zu reduzieren query-Zeit von 2,8 s bis 0,3 Sek.
LÖSUNG:
mit
SELECT *
ist wirklich naiv, die auf große Tabellen (65cols), so erkannte ich, ich brauche nur 25 von Ihnen auf der Seite - andere können Sie einfach auf die Produktseite selbst.Ich auch neu indiziert meine Tabelle etwas. Ich erstellte zusammengesetzten index auf
dann erstellte ich ein anderes speziell für die Suche cols
Letzte Sache, was ich Tat, war, mit der Abfrage wie
welche mir erlaubt zu berechnen, beeinflusst Zeilen schneller mit
nachdem mysql_query()... Aber ich kann nicht verstehen, wie es könnte schneller sein, da ERKLÄREN Sie ERWEITERTE sagt die Abfrage nicht mit einem index, der noch 0,5 s schneller, dann berechnen Sie die Anzahl der Zeilen in einzelne Abfrage.
Es scheint zu funktionieren ziemlich gut. Wenn die order by-Klausel war nicht mehr da, es wäre böse schnell, aber das ist etwas, was ich haben keinen Einfluss darauf.
Müssen noch überprüfen, meine server-Einstellungen...
Thank y ' all für Eure Hilfe..