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
innodn_xxx
Einstellungen Ihres MySQL-Servers hinzufügen ?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.Antworten:
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).
quelle
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
Ein anderer aus Perconas " Sollten Sie von MyISAM nach Innodb ziehen?" (mein kühner)
Sie können die Schreibgeschwindigkeit nicht vergleichen ...
quelle
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.
quelle
MyISAM
In den meisten Fällen ist dieInnoDB
Arbeit schneller als bei normalen Arbeiten. Das Auswählen, Aktualisieren und Einfügen ist unter normalen Umständen sehr schnell.InnoDB
ist strenger in der Datenintegrität, solangeMyISAM
es locker ist.MyISAM
hat 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.
MySIAM
Langsamer alsInnoDB
bei Tabellen, die häufig eingefügt oder aktualisiert werden, da die gesamte Tabelle für Einfügungen oder Aktualisierungen gesperrt ist.Vorteile von Innodb:
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/
quelle
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
quelle