MySQL: Fügen Sie die Leistung INNODB vs MYISAM ein

9

Ich füge in eine einfache kleine Tabelle mit 5 Attributen und 1000 Zeilen ein.

Ich habe beobachtet, wenn der Motor INNODB ist, dauert jeder Einsatz 0,03 - 0,05 Sekunden. Ich habe den Motor auf MYISAM umgestellt, dann sind die Einsätze schneller. es dauert 0,001 - 0,003.

Was ist das Problem. innodb_flush_log_trx_commit = 1 standardmäßig. Ich war diese Einstellung wie sie ist. Hier ist meine Innodb-Einstellung.

innodb_log_buffer_size : 1MB
innodb_log_file_size   : 5MB
innodb_buffer_pool_size: 8MB
innodb_flush_log_trx_commit = 1

mysql> desc table ;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(10) | YES  |     | NULL    |       |
| count | int(10) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

VARIABLEN

mysql> show variables like 'innodb%' ;
+-----------------------------------------+------------------------+
| Variable_name                           | Value                  |
+-----------------------------------------+------------------------+
| innodb_adaptive_hash_index              | ON                     |
| innodb_additional_mem_pool_size         | 1048576                |
| innodb_autoextend_increment             | 8                      |
| innodb_autoinc_lock_mode                | 1                      |
| innodb_buffer_pool_size                 | 8388608                |
| innodb_checksums                        | ON                     |
| innodb_commit_concurrency               | 0                      |
| innodb_concurrency_tickets              | 500                    |
| innodb_data_file_path                   | ibdata1:10M:autoextend |
| innodb_data_home_dir                    |                        |
| innodb_doublewrite                      | ON                     |
| innodb_fast_shutdown                    | 1                      |
| innodb_file_io_threads                  | 4                      |
| innodb_file_per_table                   | OFF                    |
| innodb_flush_log_at_trx_commit          | 1                      |
| innodb_flush_method                     |                        |
| innodb_force_recovery                   | 0                      |
| innodb_lock_wait_timeout                | 50                     |
| innodb_locks_unsafe_for_binlog          | OFF                    |
| innodb_log_buffer_size                  | 2097152                |
| innodb_log_file_size                    | 5242880                |
| innodb_log_files_in_group               | 2                      |
| innodb_log_group_home_dir               | ./                     |
| innodb_max_dirty_pages_pct              | 90                     |
| innodb_max_purge_lag                    | 0                      |
| innodb_mirrored_log_groups              | 1                      |
| innodb_open_files                       | 300                    |
| innodb_rollback_on_timeout              | OFF                    |
| innodb_stats_method                     | nulls_equal            |
| innodb_stats_on_metadata                | ON                     |
| innodb_support_xa                       | ON                     |
| innodb_sync_spin_loops                  | 20                     |
| innodb_table_locks                      | ON                     |
| innodb_thread_concurrency               | 8                      |
| innodb_thread_sleep_delay               | 10000                  |
| innodb_use_legacy_cardinality_algorithm | ON                     |

+ ------------------------------------- + ------- ----------------- + 36 Zeilen im Satz (0,00 Sek.)

Ich konnte nicht herausfinden, was damit schief gelaufen ist. Danke im Voraus. Grüße, UDAY

Uday
quelle
Können Sie die Tabellendefinition und alle innodn_xxxEinstellungen Ihres MySQL-Servers hinzufügen ?
Ypercubeᵀᴹ
Lesen Sie auch diesen Blog-Artikel, um mit den Grundlagen der Innodb-Leistungsoptimierung zu beginnen . Die Standardeinstellungen für MySQL sind normalerweise nicht für die Verwendung mit InnoDB optimiert. Ihre Pufferpoolgröße ist zu niedrig, um damit zu beginnen.
Ypercubeᵀᴹ
Bitte beachten Sie die aktualisierten Informationen.
Uday
Ich würde damit beginnen innodb_buffer_pool_size. 8 MB sind zu niedrig. Es hängt wirklich von Ihrem gesamten Server-RAM und den anderen Diensten / Anwendungen ab, die Sie auf dem Server ausführen. Sie können jedoch viele GB festlegen, wenn Ihr Gesamtspeicher hoch genug ist.
Ypercubeᵀᴹ
Eigentlich habe ich mit 64MB sogar die gleichen Ergebnisse beobachtet. Ich werde dies nacheinander erhöhen.
Uday

Antworten:

21

Der Grund ist sehr einfach. Wenn Sie eine Zeile in MyISAM einfügen, wird sie nur in den Speicher des Servers verschoben und hofft, dass der Server sie zu einem späteren Zeitpunkt auf die Festplatte leert. Viel Glück, wenn der Server abstürzt.

Wenn Sie eine Zeile in InnoDB einfügen, wird die Transaktion dauerhaft mit der Festplatte synchronisiert. Dazu muss gewartet werden, bis sich die Festplatte dreht. Rechnen Sie auf Ihrem System nach und sehen Sie, wie lange das dauert.

Sie können dies verbessern, indem Sie innodb_flush_log_at_trx_commit lockern oder Zeilen innerhalb einer Transaktion stapeln, anstatt eine Transaktion pro Zeile auszuführen.

Ich empfehle dringend, High Performance MySQL 3rd Edition zu lesen (ich bin der Autor).

Baron Schwartz
quelle
Ja, das stimmt. Aber wenn ich innodb_flush_log_at_trx_commit = 1 habe, habe ich 40% auf dem Server beobachtet. Durch die Änderung der Methode innodb_flush_method in O_DIRECT oder O_DSYNC wurde die Leistung um das Fünffache verbessert. Kannst du etwas zu diesem 40% IO mit innodb_flush_log_at_trx_commit = 1 sagen?
Uday
Wie Barons Buch auch umreißt. Es gibt auch den zusätzlichen Vorteil gleichzeitiger Einfügungen für MyISAM-Tabellen. Auf unserem Produktionsserver werden für Tabellen ohne Lücken Einfügungen von ca. 0,004 Sekunden angezeigt, sodass die gleichzeitige Einfügung ausgeführt wird. Bei unseren Tabellen mit Lücken, bei denen ein gleichzeitiges Einfügen nicht möglich ist, verringert sich die Einfügegeschwindigkeit jedoch um mehr als das 10-fache. Wir haben keine Innodb-Tische, daher kann ich mich nicht mit ihnen messen.
Haluk
2

InnoDB ist etwas langsamer, da es ACID-konform ist, MVCC hat und nützliche Dinge wie das tatsächliche Überprüfen von Fremdschlüsseln usw. ausführt.

Als Beispiel sagen sie Oracle's eigenes Whitepaper für MyISAM vs InnoDB

Diese Benchmarks wurden mit lockeren ACID-Einschränkungen durchgeführt, um eine vergleichbarere Analyse mit MyISAM ...

Ein anderer aus Perconas " Sollten Sie von MyISAM nach Innodb ziehen?" (mein kühner)

Performance

... während wir auf der Seite der Nachteile eine erheblich große Tabellengröße sehen (insbesondere wenn die Datengröße nahe an der Speichergröße liegt), im Allgemeinen langsamere Schreibvorgänge , langsamere Blob-Behandlung, Parallelitätsprobleme, Probleme bei der Verarbeitung einer sehr großen Anzahl von Tabellen, langsames Laden von Daten und ALTER TABLE und andere. Ein weiteres großes ist COUNT (*) ohne where-Klausel, die oft der Show-Stopper für sie ist, bis sie umgangen wird.

Sie können die Schreibgeschwindigkeit nicht vergleichen ...

gbn
quelle
Ja. Wir können nicht vergleichen. Aber diese Schreibgeschwindigkeit eines einzelnen normalen Einfügens dauert 0,3 - 0,5 ist überhaupt nicht akzeptabel. das ist in der Tat schrecklich. Es ist weder ein großer noch ein komplexer Tisch. Es ist nicht einmal der Live-Server. Warum ist diese Leistung dann ...?
Uday
Warum ist Ihre InnoDB-Einstellung für den Anfang so niedrig?
Gbn
Ich habe MySQL mit apt-get auf meinem lokalen installiert. Sie sind Standardeinstellungen. Aber ich kann diese Schreibleistung nicht akzeptieren. Haben Sie das Gefühl, dass etwas verbessert werden muss?
Uday
1

Wenn Sie InnoDB verwenden, haben Sie eine Sperre auf Zeilenebene und in MyISAM eine Sperre auf Tabellenebene. Was in einem Benchmark mit nur 1 Verbindung zur DB keinen Sinn macht. Wenn Sie jedoch 100 gleichzeitige Skripte zum Einfügen ausführen, ist der Unterschied offensichtlich.

Beachten Sie auch, dass InnoDB Daten in der Reihenfolge des Primärschlüssels phisisch speichert. Wenn es sich nicht um eine automatische Inkrementierung handelt und die Einfügungen zufällige Werte für den Primärschlüssel erzeugen, werden Sie aufgrund zufälliger Schreibvorgänge die E / A-Grenzwerte erreichen. Dies ist in einem Benchmark sichtbar, wenn die Tabellengröße größer als der Pufferpool ist.

Maxim Krizhanovsky
quelle
Spät zur Party, ja, aber die heilige Kuh hat diesem zweiten Absatz eine Menge geholfen. Darüber hinaus ist es der einzige Ort, den ich gesehen habe, selbst nachdem ich mir über ein Dutzend SO- und DBA-SO-Beiträge zur Beschleunigung von MySQL-Inserts angesehen habe.
Jeutnarg
0

MyISAMIn den meisten Fällen ist die InnoDBArbeit schneller als bei normalen Arbeiten. Das Auswählen, Aktualisieren und Einfügen ist unter normalen Umständen sehr schnell. InnoDBist strenger in der Datenintegrität, solange MyISAMes locker ist. MyISAMhat einen Volltextsuchindex, InnoDB nicht.

Vorteil von MyISAM:

  • Einfacher zu entwerfen und zu erstellen, daher besser für Anfänger. Keine Sorge um die fremden Beziehungen zwischen Tabellen.

  • Schneller als InnoDB insgesamt aufgrund der einfacheren Struktur, also viel weniger Kosten für Serverressourcen. Volltextindizierung.

  • Besonders gut für leseintensive (ausgewählte) Tabellen.

MySIAMLangsamer als InnoDBbei Tabellen, die häufig eingefügt oder aktualisiert werden, da die gesamte Tabelle für Einfügungen oder Aktualisierungen gesperrt ist.

Vorteile von Innodb:

  • InnoDB sollte dort eingesetzt werden, wo die Datenintegrität Priorität hat, da sie von Natur aus mithilfe von Beziehungsbeschränkungen und Transaktionen behandelt wird.
  • Schneller in schreibintensiven Tabellen (Einfügungen, Aktualisierungen), da die Sperre auf Zeilenebene verwendet wird und nur Änderungen an derselben Zeile gespeichert werden, die eingefügt oder aktualisiert wird.

Schlussfolgerung: Der Vergleich ist ziemlich einfach. InnoDB eignet sich besser für datenkritische Situationen, in denen häufige Einfügungen und Aktualisierungen erforderlich sind. MyISAM hingegen bietet eine bessere Leistung bei Anwendungen, die nicht ganz von der Datenintegrität abhängen und meist nur die Daten auswählen und anzeigen.

http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

Mahesh Patil
quelle
Hei ... ich kenne diese konzeptuellen Sachen. Mein Fall ist sehr einfach. einfache einfache Tabelleneinlage mit schlechterer Leistung aufgrund von innodb. Lassen Sie mich wissen, ob sm etwas dies ändern kann. Grüße -uday
Uday
"MyISAM insgesamt schneller als InnoDB". Das ist zumindest umstritten. Es gibt Artikel, mit denen FKs in bestimmten Fällen die Leistung verbessern können. Und selbst wenn dies zutrifft, ist eine geringfügige Leistungssteigerung in einigen Fällen kein guter Grund, die Integrität zu verlieren.
Ypercubeᵀᴹ
1
@uday: Tatsächlich ist MyISAM langsamer, wenn sich die Arbeitslast aufgrund der von MyISAM auferlegten Sperren auf viele gleichzeitige Lese- und Schreibvorgänge verlagert .
a_horse_with_no_name
@uday diese Werte einstellen und erneut versuchen? innodb_log_buffer_size = 16M für innodb_buffer_pool_size Sie können diesen Wert auf 70-80% des verfügbaren Speichers für Nur-Innodb-Installationen für innodb_flush_log_trx_commit = 2 festlegen - schreibt bei jedem Transaktions-Commit in den OS-Cache. Jede Sekunde auf die Festplatte.
Mahesh Patil
1
Durch Ändern der innodb_flush_method von Standard auf O_DSYNC oder O_DIRECT wurde die Leistung um das Fünffache verbessert.
Uday
0

Es gibt subtile Unterschiede beim INDEXing zwischen den Motoren. Bis Sie dies überprüfen, können mysteriöse Fälle auftreten, in denen ein Motor schneller als der andere ist - in beide Richtungen. Selbst nach Überprüfung der Indizes gibt es Fälle, in denen einer schneller ist als der andere. Dies umfasst alle mir bekannten Fälle: http://mysql.rjweb.org/doc.php/myisam2innodb

Und, wie andere gesagt haben, stellen Sie den Motor ein. Siehe http://mysql.rjweb.org/doc.php/memory

Rick James
quelle