2011-01-14 11 views
0

Ich weiß, das ist eine sehr breite Frage, aber hier ist meine Situation: 1) Ich habe ein Hibernate-fähiges Java-Programm, das Protokolle alle 15 Minuten in MySQL (InnoDB) Dumps. Die Log-Daten selbst sind humogen (100k-500k Zeilen Log).MySQL Query Optimierung --- Ihre Gedanken

2) Momentan werden im Frontend zwei Dinge angeboten, die auf Basis der Zeitstempel suchen und berichten.

3) Die Abfrage dauert eine looong Zeit (10-15 Minuten) führt zurück zu bekommen, obwohl ich Indizes haben gestellt und hat ERKLÄREN, wo die Zeit seiner Einnahme zu studieren usw.

4) Auf dem MySQL-Server Level, ich habe den Query Cache unter anderem erhöht.

Ich bin auf den Knien, um dieses Problem zu lösen. Ich muss wissen, gibt es etwas, was ich tun kann, um die Abfragegeschwindigkeit zu erhöhen.

Vielen Dank im Voraus. Bo

+0

BTW Ich verwende nicht Hibernate im Frontend, um die Ergebnisse anzuzeigen. Es handelt sich um SQL-Abfragen, die in PERL eingebettet sind und das Frontend behandeln. – BoCode

+1

die großen Protokolldaten sollten als Datei statt Datenbank gespeichert werden? – ajreal

+1

Meinen Sie, dass Sie alle 15 Minuten 100k-500k Zeilen zu einem einzelnen Tisch hinzufügen? Fügen Sie die Tabellendefinition oder -definitionen, die von Ihnen verwendete Abfrage und möglicherweise Ihre EXPLAIN-Ausgabe hinzu. Sollte die Chancen verbessern, nützliche Antworten zu erhalten. Kann nützlich sein, um die Perl zu sehen, die auch die Ergebnisse verarbeitet. –

Antwort

0

Verwenden Sie eine Volltext-Suchmaschine in Verbindung mit mysql.

Zum Beispiel sphinx. Nach jedem Insert-Zyklus muss Sphinx seinen Cache aktualisieren. Dann können Sie sphinxse (verwenden Sie sphinx als Speicher-Engine in mysql) verwenden, um Ihr Ergebnis zu erhalten. http://www.howtoforge.com/sphinx-as-mysql-storage-engine-sphinxse

Auch 10 bis 15 Minuten scheint zu viel Zeit für 500000 Einsätze. Sie sollten MyISAM als Speichermodul für Protokolltabellen verwenden und dann INSERT DELAYED anstelle von INSERT verwenden (ich weiß nicht, wie ich das mit hybernate erreichen kann).