2011-01-17 3 views
1

Ich bin der neue Betreuer einer Anwendung, die in der Produktion MySQL läuft. Der vorherige Betreuer hat keine Dokumentation mehr hinterlassen und kann nicht kontaktiert werden.Signifikanter Leistungsunterschied zwischen einem lokalen MySQL-Server und einem Produktions-MySQL-Server

Das Problem, das ich Gesicht ist, dass die folgende Anfrage etwa 10 Sekunden dauert auszuführen:

SELECT COUNT(*) FROM `users` WHERE (`active` = TRUE AND `deleted_at` IS NULL); 

Es gibt etwa 170.000 Datensätze in der Tabelle users und ohne Indizes.

Die EXPLAIN-Befehl auf diese Anfrage:

mysql> EXPLAIN SELECT COUNT(*) FROM `users` WHERE (`active` = TRUE AND `deleted_at` IS NULL); 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra   | 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 
| 1 | SIMPLE  | users | ALL | NULL   | NULL | NULL | NULL | 145407 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 

Aktuelle Website-Eigentümer (nicht technische Person) sagte mir, dass Leistungen plötzlich vor 2 Wochen gesunken. Bevor ich also versuche, Indizes hinzuzufügen, habe ich die Produktionsdatenbank in meinen lokalen MySQL-Server ausgelagert. Die gleichen Anfragen dauern nur 4 Sekunden lokal.

Ich bin ziemlich überrascht von diesem Unterschied, und ich frage mich, ob es möglich ist, dass ein Problem auf dem OS oder MySQL-Server es erklären könnte? Lohnt es sich, auf diese Weise zu untersuchen? Wenn das so ist, wie? Wenn nicht, ist eine solche Leistung für eine solche Abfrage ohne Indizes "normal" (ich habe begrenzte Erfahrung mit SQL-Leistung)?

Auf dem Server:

$ mysql -u root --version 
mysql Ver 14.14 Distrib 5.1.44, for unknown-linux-gnu (x86_64) using readline 5.1 
$ cat /etc/redhat-release 
CentOS release 5.4 (Final) 

Lokale Maschine:

$ $ mysql -u root --version 
mysql Ver 14.14 Distrib 5.1.42, for apple-darwin10.2.0 (i386) using EditLine wrapper 

Dank!

EDIT für Traroth:

  • RAM: 4GB auf die Produktion, 2GB auf dem lokalen Rechner
  • Anfrage Caching: in der Tat auf dem lokalen Rechner nachfolgenden Anforderungen sind viel schneller, auf die Produktion auch es wird immer besser auch, aber immer noch langsam (im besten Fall etwa 5 Sekunden). Denkst du das ist normal?
  • beide DB Verwendung InnoDB
  • Dateisystem: Produktion Box ist ein VPS 'simfs' zeigt sich, wenn ich für das Dateisystem
+0

Welche Menge an RAM haben Sie auf beiden Systemen? –

Antwort

0

Sie können versuchen, einen Index für Spalte zu bauen active, and deleted_at

ich delete_at is null denken würde, ist nur ...

Sie könnte es zu smallint konvertieren, Standard 0 (vertreten ist null)

Wenn Sie Bulk-Löschung zu tun, optimize table your_table; werden die Daten für eine bessere Leistung komprimieren.

+0

ok danke, werde das versuchen – Florent2

0

Mögliche Unterschiede sehen:

  • , wenn Sie die gleiche laufen Abfrage mehrmals, MySQL wird die Ergebnisse zwischenspeichern, so dass jedes Mal, wenn Sie es nach dem ersten Mal ausführen, solange die Ergebnisse im Cache sind, wird es sehr schnell sein.
  • Könnte ein Unterschied von Dateisystemen sein. Ihr Linux wird wahrscheinlich ein ext3 oder ext4 fs, und Ihr Mac ein HFSX fs. Sie sollten versuchen, Ihr Backup auf einer Linux-Box auszuführen.
  • Verwenden Sie dieselbe Datenbank-Engine für beide Versionen Ihrer Datenbank? Die Geschwindigkeit kann sehr unterschiedlich sein, je nach dem Sie verwenden (InnoDB, MyISAM und so weiter)
+0

Danke Traroth! Ich habe meine Frage bearbeiten, um diese Informationen hinzuzufügen. – Florent2

0

Die Maschinen unterscheiden sich in vieler Hinsicht (CPU-Anzahl, CPU-Geschwindigkeit, RAM-Menge, RAM-Geschwindigkeit, Plattengeschwindigkeit (Zugriffszeit und Durchsatz), Plattenverteilung und natürlich Systemlast. Sie sollten also keine Leistung erwarten

Verwandte Themen