我对mysql的奇怪行为有疑问。在大约 3000 行的表的 where 子句中只有主键的简单更新查询有时需要 2 秒以上。根据命令,它卡在具有高 Context_vulner 值(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 socket。
我应该怎么做才能解决这个问题?