Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mysql is slow with InnoDB during insert compared to MYISAM

I just installed MySQL 5.5 which have InnoDB default engine and realized INSERT queries really slow! After disabling general-log it got a bit better but still real slow. I analyzing mysql to find the problem but no chance.

Here's benchmark comparing this:

Testing a(n) MYISAM table using 500 rows. - 5866 inserts per second. - 128866 row reads per second. - 56306 updates per second.

Testing a(n) INNODB table using 500 rows. - 9 inserts per second. - 28539 row reads per second. - 4358 updates per second.

I've got 9 insert queries on InnoDB compared to 5866 with MyISAM.

here's my my.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

I've edited this file for high performance, also never had any problem with mysql 5.1

like image 201
Pouya Sanooei Avatar asked Jan 02 '13 11:01

Pouya Sanooei


People also ask

Why is InnoDB slower than MyISAM?

In terms of data queries (SELECT), InnoDB is the clear winner, but when it comes to database writes (INSERT and UPDATE), MyISAM is somewhat faster. However, the lower speed of InnoDB is more than compensated for by its transaction protocol.

Which is faster MyISAM or InnoDB?

The performance of InnoDB for large volumes of data is better as compared to MyISAM. MyISAM doesn't support transactional properties and is faster to read. As compared to InnoDB, the performance for a high volume of data is less.

Why is InnoDB so slow?

That's because it's not designed to cache data. InnoDB caches every data page and index page (and its grandmother) it touches. If your InnoDB Buffer Pool is too small, you could be caching pages, invalidating pages, and removing pages all in one query.


1 Answers

As requested, the logging on commit level often causes a lot of disk-stress and by that reducing the throughput of data on mysql instances with inno for a great deal.

Setting your mysql.ini to innodb_flush_log_at_trx_commit = 0 (or 2) does often solve this issue.

Plese note, ACID rules would love that value to be at 1...

like image 100
Najzero Avatar answered Nov 03 '22 01:11

Najzero