mysql の奇妙な動作に問題があります。~3000 行のテーブルの where 句に主キーのみを含む単純な更新クエリは、2 秒以上かかる場合があります。コマンドによると、Context_volunary 値が高い (200+) と「クエリ終了」フェーズでスタックしますSHOW PROFILE ALL
。
ほとんどの場合、接続の最初のクエリです。
サンプルクエリ:
UPDATE `users`
set last_portal_login = NOW()
, ip = 1464635301
, browser = "chrome"
where uid = 2021
テーブル クエリを作成します。
CREATE TABLE users
(
uid
int(10) unsigned NOT NULL,
login
char(50) COLLATE utf8_polish_ci NOT NULL,
hide_me
tinyint(1) unsigned NOT NULL DEFAULT '0',
addon
int(10) unsigned NOT NULL DEFAULT '0',
protocol
float unsigned NOT NULL DEFAULT '0',
mode
enum('firefox','lite','chrome','opera') COLLATE utf8_polish_ci DEFAULT NULL,
browser
enum('firefox','chrome','opera','ie','safari') COLLATE utf8_polish_ci DEFAULT NULL,
last_login
datetime DEFAULT NULL,
last_portal_login
datetime DEFAULT NULL,
ip
int(10) unsigned DEFAULT NULL,
PRIMARY KEY (uid
),
UNIQUE KEY login
(login
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci$$
InnoDB の構成は次のとおりです。
'innodb_adaptive_flushing', 'ON'
'innodb_adaptive_hash_index', 'ON'
'innodb_additional_mem_pool_size', '8388608'
'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:10M:autoextend'
'innodb_data_home_dir', ''
'innodb_doublewrite', 'ON'
'innodb_fast_shutdown', '1'
'innodb_file_format', 'Antelope'
'innodb_file_format_check', 'ON'
'innodb_file_format_max', 'Antelope'
'innodb_file_per_table', 'OFF'
'innodb_flush_log_at_trx_commit', '2'
'innodb_flush_method', 'O_DIRECT'
'innodb_force_load_corrupted', 'OFF'
'innodb_force_recovery', '0'
'innodb_io_capacity', '200'
'innodb_large_prefix', 'OFF'
'innodb_lock_wait_timeout', '50'
'innodb_locks_unsafe_for_binlog', 'OFF'
'innodb_log_buffer_size', '8388608'
'innodb_log_file_size', '67108864'
'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_print_all_deadlocks', 'OFF'
'innodb_purge_batch_size', '20'
'innodb_purge_threads', '0'
'innodb_random_read_ahead', 'OFF'
'innodb_read_ahead_threshold', '56'
'innodb_read_io_threads', '4'
'innodb_replication_delay', '0'
'innodb_rollback_on_timeout', 'OFF'
'innodb_rollback_segments', '128'
'innodb_spin_wait_delay', '6'
'innodb_stats_method', 'nulls_equal'
'innodb_stats_on_metadata', 'ON'
'innodb_stats_sample_pages', '8'
'innodb_strict_mode', 'OFF'
'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', 'ON'
'innodb_use_sys_malloc', 'ON'
'innodb_version', '5.5.30'
'innodb_write_io_threads', '4'
Mysql バージョン: dotdeb.org の 5.5.30、接続は UNIX ソケットに基づいています。
これを修正するにはどうすればよいですか?