我知道这类问题经常出现。 但是我做了大量的研究,尝试了很多不同的设置,但是仍然有相同的问题:通常非常快的查询可能会随机地花费3到5秒。
该服务器是一个i7-3770(8核心)与32GB内存。 CPU使用率约为50%,而不是CPU高峰。 没有交换使用,可用内存平均约10GB。 我在CentOS 6上运行mysql 5.5.32。
已经为MySQL分配了9GB的RAM,它使用了大约2GB。 所有的数据都应该适合内存(600MB的数据,700MB的索引)。
平均每秒查询次数(无实际秒数):
这是一个查询的例子,只需要几毫秒,但有时超过3秒:
# Query_time: 4.337884 Lock_time: 0.050146 Rows_sent: 1 Rows_examined: 1 SELECT me.id, me.url, me.filename, me.instance_id, me.virtual_id, me.status, me.user_id, me.time_added, me.time_finished, me.priority, me.size, me.delay, me.flash_delay, me.tries, me.details, me.json_file, me.html, me.shots, me.shot_interval, me.screen_width, me.screen_height FROM Screenshots me WHERE ( me.id = '5992705' );
id是主键。
尽pipe我有更多的SELECT比INSERT查询,我有更慢的INSERT比SELECT
我所尝试和testing的是:
调整my.cnf帮了很多忙。 我试过查询caching启用和禁用,没有太大的区别。
使用从属于SELECT使得事情实际上变得最糟糕:我对主服务器的查询速度缓慢,但是可能高达12秒!
这里是我目前的my.cf(在这种情况下查询caching):
tmp_table_size = 32M max_heap_table_size = 32M query_cache_type = 1 query_cache_size = 1M thread_cache_size = 50 open_files_limit = 65535 table_definition_cache = 1024 table_open_cache = 4096 innodb_flush_method = O_DIRECT innodb_log_files_in_group = 2 innodb_log_file_size = 256M innodb_log_buffer_size = 8M innodb_thread_concurrency = 8 innodb_flush_log_at_trx_commit = 0 innodb_file_per_table = 1 innodb_buffer_pool_size = 9G max_connections=1000 transaction-isolation = READ-UNCOMMITTED innodb_locks_unsafe_for_binlog = 1 innodb_io_capacity = 1000 innodb_change_buffering = inserts innodb_fast_shutdown = 0 key_buffer_size = 2G
我没有想法。 我无法find解释这些慢查询的任何模式(频率,间隔等)。
什么是你的磁盘设置? 你不提这个。 听起来像它的IO界限。
innodb_io_capacity – 在默认情况下,除非您有充分的理由或基准certificate您的设置是正确的,否则没有理由改变它。
我怀疑你有这个设置太高。 InnoDB写入线程可以每秒钟在磁盘上抛出比他们能够处理更多的数据,从而导致I / O排队。