2011-07-15 71 views
1

我连续批量插入到mysql innoDB表中,每秒插入比例减慢。 某些行为是 - 如果关闭数据插件程序(Java)应用程序,mysql会在一段时间内执行一些I/O操作。 - 添加一些insert然后关闭mysql服务器,shutdown操作持续时间太长。如果在没有任何插入的情况下启动和停止mysql,则启动和停止操作如此之快 - 插入速度不是(非常)取决于表上的数据量。如果重新启动mysql服务器,每秒插入类似于上次重新启动插入每秒的值。InnoDB插入计数减慢

我看了论坛上的一些评论,不加连续,2插入之间有空白。它有意义吗?为什么sql慢下来?

查询SHOW VARIABLES LIKE 'INNO%'结果低于

innodb_adaptive_flushing = ON 
innodb_adaptive_hash_index = ON 
innodb_additional_mem_pool_size = 20971520 
innodb_autoextend_increment = 8 
innodb_autoinc_lock_mode = 1 
innodb_buffer_pool_instances = 1 
innodb_buffer_pool_size = 268435456 
innodb_change_buffering = all 
innodb_checksums = ON 
innodb_commit_concurrency = 0 
innodb_concurrency_tickets = 500 
innodb_data_file_path = ibdata1:50M:autoextend 
innodb_data_home_dir = 
innodb_doublewrite = ON 
innodb_fast_shutdown = 1 
innodb_file_format = Barracuda 
innodb_file_format_check = ON 
innodb_file_format_max = Antelope 
innodb_file_per_table = ON 
innodb_flush_log_at_trx_commit = 2 
innodb_flush_method = O_DSYNC 
innodb_force_recovery = 0 
innodb_io_capacity = 200 
innodb_lock_wait_timeout = 50 
innodb_locks_unsafe_for_binlog = OFF 
innodb_log_buffer_size = 8388608 
innodb_log_file_size = 268435456 
innodb_log_files_in_group = 2 
innodb_log_group_home_dir = ./ 
innodb_max_dirty_pages_pct = 75 
innodb_max_purge_lag = 0 
innodb_mirrored_log_groups = 1 
innodb_old_blocks_pct = 37 
innodb_old_blocks_time = 0 
innodb_open_files = 300 
innodb_purge_batch_size = 20 
innodb_purge_threads = 0 
innodb_read_ahead_threshold = 56 
innodb_read_io_threads = 4 
innodb_replication_delay = 0 
innodb_rollback_on_timeout = OFF 
innodb_spin_wait_delay = 6 
innodb_stats_on_metadata = ON 
innodb_stats_sample_pages = 8 
innodb_strict_mode = ON 
innodb_support_xa = ON 
innodb_sync_spin_loops = 30 
innodb_table_locks = ON 
innodb_thread_concurrency = 0 
innodb_thread_sleep_delay = 10000 
innodb_use_native_aio = OFF 
innodb_use_sys_malloc = ON 
innodb_version = 1.1.1 
innodb_write_io_threads = 4 

感谢

回答

0

减速原因是插入操作存储在缓存(脏页)和定期写入硬盘驱动器。直到脏页内存已满为止插入操作很快,然后缓存已满并插入写入速度瓶颈磁盘(I/O)。 您可以使用下面的SQL显示脏页面大小“修改DB页”

show engine innodb status 
0

InnoDB的工作方式是默认在自动提交模式,这意味着每次插入需要写入磁盘的两倍。使用扩展插入(又名多行插入)并将多个连续插入包含在事务中可提高性能。

+0

从我的代码conn.setAutoCommit(假); –

+0

但是你在eery单一提交之后还是在大批量之后进行提交? – Mchl

+0

顺便说一句:批量上传大量数据的最快方法是使用LOAD DATA INFILE' – Mchl