Ich habe eine MySQL-Datenbank und einige meiner Abfragen wurden langsam. Die Abfragezeit ist nicht stabil. Die meisten Abfragen sind schnell, aber einige von ihnen (möglicherweise lesen und geben weniger Daten zurück) dauern lange.
Ich weiß, dass Best Practices das Hinzufügen von Indizes oder Refactor-Code sind, aber ich habe bereits Indizes hinzugefügt und möchte Code nicht refactorisieren (zumindest solange ich andere Varianten habe).
Ich habe 8 GB freien Speicher und die CPU ist zu Spitzenzeiten nur zu 25% ausgelastet. Ich möchte also alle meine Ressourcen nutzen.
Ich versuche, die MySQL-Konfiguration zu optimieren, habe aber noch keine Erfahrung mit solchen Optimierungen. Daher erhöhe ich die Produktivität nicht so sehr, wie ich es möchte. Hier ist ein Beispiel:
# Query_time: 3.019647 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 504
SET timestamp=1313380874;
SELECT COUNT(inboxentities.id) FROM inboxentities WHERE (active=true)AND(deleted=false)AND((to_ = '44219ca4-a657-4909-b30d-a7ba0ed8e4b0'))AND(notification=true);
PS inboxentities
hat 500.000 Datensätze. Ich habe index1 (idx_to): to_
und index2 (idx_complex): deleted
, notification
, active
,to_
Hier ist das Ergebnis von EXPLAIN Select:
+----+-------------+---------------+------+------------------------------------------------+--------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+------+------------------------------------------------+--------+---------+-------+------+-------------+
| 1 | SIMPLE | inboxentities | ref | idx_status,idx_statusToname,idx_to,idx_complex | idx_to | 768 | const | 286 | Using where |
+----+-------------+---------------+------+------------------------------------------------+--------+---------+-------+------+-------------+
quelle
--one-thread
in meiner Konfiguration. Auch ich habethread_concurrency = 8
Option.Antworten:
Hier ist Ihre ursprüngliche Abfrage aus dem langsamen Protokoll
Der effektivste Weg, eine Abfrage wie diese zu indizieren, besteht darin, einen Index zu generieren, der so viele Felder wie möglich in der WHERE-Klausel abdeckt. Ein Index, der unter Berücksichtigung dieses Konzepts erstellt wurde, wird als Deckungsindex bezeichnet .
Schauen Sie sich die WHERE-Klausel an
Obwohl Sie idx_complex definiert haben, enthält die Abfrage ein weiteres Element, das dazu führt, dass der idx_complex-Index nicht verwendet wird: die COUNT- Klausel (inboxentities.id) .
Sie zählen etwas in einer Tabelle. Der Index hat keinen Referenzpunkt auf die Tabelle außer to_. Der MySQL Query Optmizer würde idx_to, den einfachsten Index, auswählen. Um das MySQL Query Optimizer zu zwingen, den gewünschten Abdeckungsindex (idx_complex) auszuwählen, zählen Sie einfach COUNT aus dem Index und nicht aus der Tabelle. Mein Vorschlag ist, die Abfrage leicht zu ändern:
Versuche es !!!
UPDATE 15.08.2011 15:16 EDT
Einige haben geringfügige bis signifikante Leistungssteigerungen festgestellt, indem sie my.cnf geändert haben, um die Leistungsanforderungen von Storage Engine zu erfüllen.
Sie müssen den MyISAM-Schlüsselcache und den InnoDB-Pufferpool festlegen.
Dies empfiehlt die richtige Größe des MyISAM-Schlüsselcaches für Ihren angegebenen Datensatz:
Dadurch wird der InnoDB-Pufferpool mit der richtigen Größe für Ihren angegebenen Datensatz empfohlen
Übrigens
Wenn Sie darüber hinausgehen, senden Sie mir eine E-Mail.
Wenn Sie diese Einstellungen vorgenommen haben, stellen Sie sicher, dass die kombinierte Anzahl für empfohlene_Schlüsselpuffergröße und empfohlene_Bundpuffer_Poolgröße 75% des installierten Arbeitsspeichers nicht überschreitet.
UPDATE 15.08.2011 15:35 EDT
Möglicherweise möchten Sie mysqltuner.pl auf dem Server ausführen, damit Sie erfahren, wie Sie die Speicherauslastung für DB Connections tweeken. Zu den Einstellungen für die Speichernutzung pro DB-Verbindung gehören:
Diese werden normalerweise mit max_connections multipliziert .
Sie können mysqltuner.pl wie folgt über die Linux-Befehlszeile herunterladen:
Die Ausgabe davon ist ungefähr so:
quelle