mysql ist langsam mit InnoDB beim einfügen im Vergleich zu MYISAM
Ich gerade installiert, MySQL 5.5, die Standard-engine InnoDB und realisiert INSERT-Abfragen sehr langsam! Nach der Deaktivierung der general-log-es wurde ein bisschen besser, aber immer noch sehr langsam. Ich die Analyse von mysql das problem zu finden, aber keine chance.
Hier ein benchmark Vergleich:
Prüfung eine(n) MYISAM-Tabelle mit 500 Zeilen.
- 5866 inserts pro Sekunde.
- 128866 Zeile Lesevorgänge pro Sekunde.
- 56306 updates pro Sekunde.
Prüfung eine(n) INNODB-Tabelle mit 500 Zeilen.
- 9-inserts pro Sekunde.
- 28539 Zeile Lesevorgänge pro Sekunde.
- 4358-updates pro Sekunde.
Habe ich 9 einfügen von Abfragen auf InnoDB gegenüber 5866 mit MyISAM.
hier mein meine.ini(windows 8 64bit):
[mysql]
default-character-set=utf8
no-auto-rehash
[mysqld]
max_allowed_packet = 500M
table_open_cache = 512
# The TCP/IP Port the MySQL Server will listen on
port=3306
# Path to installation directory. All paths are usually resolved relative to this.
basedir="C:\Program Files\MySQL\MySQL Server 5.5\"
# Path to the database root
datadir="D:\MySQL Datafiles\data\"
# The default character set that will be used when a new schema or table is
# created and no character set is defined
character-set-server=utf8
# The default storage engine that will be used when create new tables when
# default-storage-engine=MYISAM
# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
# Enable Windows Authentication
# plugin-load=authentication_windows.dll
# General and Slow logging.
#log-output=FILE
#general-log=0
#general_log_file="POOYA.log"
#slow-query-log=0
#slow_query_log_file="POOYA-slow.log"
#long_query_time=10
#innodb_flush_log_at_trx_commit = 2
# Binary Logging.
# log-bin
# Error Logging.
log-error="POOYA.err"
max_connections=100
query_cache_size=32M
table_cache=512
tmp_table_size=64M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=64M
key_buffer_size=256M
# Size of the buffer used for doing full table scans of MyISAM tables.
# Allocated per thread, if a full scan is needed.
read_buffer_size=1M
read_rnd_buffer_size=4M
# This buffer is allocated when MySQL needs to rebuild the index in
# REPAIR, OPTIMZE, ALTER table statements as well as in LOAD DATA INFILE
# into an empty table. It is allocated per thread so be careful with
# large settings.
sort_buffer_size=1M
#*** INNODB Specific options ***
# innodb_data_home_dir=0.0
# Use this option if you have a MySQL server with InnoDB support enabled
# but you do not plan to use it. This will save memory and disk space
# and speed up some things.
# skip-innodb
# Additional memory pool that is used by InnoDB to store metadata
# information. If InnoDB requires more memory for this purpose it will
# start to allocate it from the OS. As this is fast enough on most
# recent operating systems, you normally do not need to change this
# value. SHOW INNODB STATUS will display the current amount used.
innodb_additional_mem_pool_size=64M
# If set to 1, InnoDB will flush (fsync) the transaction logs to the
# disk at each commit, which offers full ACID behavior. If you are
# willing to compromise this safety, and you are running small
# transactions, you may set this to 0 or 2 to reduce disk I/O to the
# logs. Value 0 means that the log is only written to the log file and
# the log file flushed to disk approximately once per second. Value 2
# means the log is written to the log file at each commit, but the log
# file is only flushed to disk approximately once per second.
innodb_flush_log_at_trx_commit=1
# The size of the buffer InnoDB uses for buffering log data. As soon as
# it is full, InnoDB will have to flush it to disk. As it is flushed
# once per second anyway, it does not make sense to have it very large
# (even with long transactions).
innodb_log_buffer_size=8M
# InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes and
# row data. The bigger you set this the less disk I/O is needed to
# access data in tables. On a dedicated database server you may set this
# parameter up to 80% of the machine physical memory size. Do not set it
# too large, though, because competition of the physical memory may
# cause paging in the operating system. Note that on 32bit systems you
# might be limited to 2-3.5G of user level memory per process, so do not
# set it too high.
innodb_buffer_pool_size=512M
# Size of each log file in a log group. You should set the combined size
# of log files to about 25%-100% of your buffer pool size to avoid
# unneeded buffer pool flush activity on log file overwrite. However,
# note that a larger logfile size will increase the time needed for the
# recovery process.
innodb_log_file_size=49M
# Number of threads allowed inside the InnoDB kernel. The optimal value
# depends highly on the application, hardware as well as the OS
# scheduler properties. A too high value may lead to thread thrashing.
innodb_thread_concurrency=17
[mysqldump]
quick
max_allowed_packet = 16M
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
Habe ich bearbeitet diese Datei, die für hohe Leistung, auch noch nie irgendwelche Probleme mit mysql 5.1
- sollten Sie einen Blick in
innodb_flush_log_at_trx_commit = 0
- sollte die Dinge etwas beschleunigen ziemlich viel (edit, vielleicht 2 würde auch funktionieren, da braucht es Druck von der Festplatten-I/O) - wie über das Update auf mysql 5.5 oder mysql 5.6?
- Ich habe ihn an 2 und es behoben haben wie die Hölle! es ist jetzt 5615-Einsätze p/s. wie konnte so eine kleine änderung macht einen großen Unterschied, wie ich nie wissen 😀 danke, dass Sie sich wie eine million 🙂
- Du darfst diese Antwort, damit kann ich markieren Sie es als richtig(ich kann keine Antwort auf meine eigene Frage, nicht genug rep :/)
- Könnten Sie teilen sich die benchmark nach der Einstellung der innodb_flush_log_at_trx_commit auf 0
- Ich habe nicht das gleiche Betriebssystem oder die Umgebung nicht mehr, aber ich erinnere mich, 6k inserts pro Sekunde.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als gebeten, die Anmeldung verpflichten Ebene oft verursacht eine Menge von disk-stress und damit die Verringerung der Durchsatz von Daten auf mysql-Instanzen mit inno für ein großes Geschäft.
Einstellung Ihres mysql.ini
innodb_flush_log_at_trx_commit = 0
(oder 2) hat oft dieses Problem zu lösen.Plese Anmerkung, SÄURE-Regeln würde gerne, dass der Wert bei 1...
Sind Sie mit dem hinzufügen der Zeilen ein zu einer Zeit?
Wenn Sie hinzufügen, die mehrere Zeilen pro Transaktion, das hilft viel.
InnoDB #2 und #3 sehr viel schneller als #1.
#2 hilft auch mit MyISAM, aber nicht annähernd so viel. Grobe zahlen, die ich gesehen habe diese Geschwindigkeit bis MyISAM-2x, und InnoDB von 100x.
Kann man auch einstellen das es direkt auf der MySQL-Kommandozeile mit dem folgenden Befehl: