0

I have three in production MySQL database (5.7) with about 160GB of Data. The largest table is about 20GB, and the largest schema is about 40GB. I think all tables are innodb table. Currently I don't know about the configuration of the MySQL server machine. And I was asked to purchase a new server to replace the old one. This database is really slow and cannot hold more than 100 connections. I used this query to get the max_memory:

SELECT ( @@key_buffer_size
+ @@query_cache_size
+ @@innodb_buffer_pool_size
+ @@innodb_log_buffer_size
+ @@max_connections * ( 
    @@read_buffer_size
    + @@read_rnd_buffer_size
    + @@sort_buffer_size
    + @@join_buffer_size
    + @@binlog_cache_size
    + @@thread_stack
    + @@tmp_table_size )
) / (1024 * 1024 * 1024) AS MAX_MEMORY_GB;

And It gives me 54.7040(GB) as result. I assume this could be close to the server's physical RAM size? One thing I feel strange is the the innodb_buffer_pool_size is only around 4GB. With this query: SHOW VARIABLES LIKE 'innodb_buffer_pool%';

The result is.

innodb_buffer_pool_instances    1
innodb_buffer_pool_size 4294967296

I think this is misconfigured. Am I right? I'm planning to purchase an 64 core CPU with 512 GB of RAM to host it. And I'm planning to upgrade them from MySQL 5.7 to 8.0. Will this becomes a huge performance bump? And do you guys think I should combine the three databases into one on the new server or still host three database instance? And if I combine them into a one database. What will be the reasonable buffer_pool_size that I need to set. I'm new to database, so my question might be silly. Thanks for your help and advises!

Update: Attached the show global status

Aborted_clients, 24213
Aborted_connects, 0
Binlog_cache_disk_use, 268
Binlog_cache_use, 2245790
Binlog_stmt_cache_disk_use, 0
Binlog_stmt_cache_use, 0
Bytes_received, 45415670865
Bytes_sent, 77195756974
Com_admin_commands, 39693518
Com_assign_to_keycache, 0
Com_alter_db, 0
Com_alter_db_upgrade, 0
Com_alter_event, 0
Com_alter_function, 0
Com_alter_procedure, 0
Com_alter_server, 0
Com_alter_table, 5
Com_alter_tablespace, 0
Com_analyze, 0
Com_begin, 0
Com_binlog, 0
Com_call_procedure, 0
Com_change_db, 72471
Com_change_master, 0
Com_check, 0
Com_checksum, 0
Com_commit, 1719583
Com_create_db, 0
Com_create_event, 0
Com_create_function, 0
Com_create_index, 0
Com_create_procedure, 0
Com_create_server, 0
Com_create_table, 175
Com_create_trigger, 0
Com_create_udf, 0
Com_create_user, 0
Com_create_view, 0
Com_dealloc_sql, 0
Com_delete, 8943
Com_delete_multi, 0
Com_do, 0
Com_drop_db, 0
Com_drop_event, 0
Com_drop_function, 0
Com_drop_index, 0
Com_drop_procedure, 0
Com_drop_server, 0
Com_drop_table, 176
Com_drop_trigger, 0
Com_drop_user, 0
Com_drop_view, 0
Com_empty_query, 0
Com_execute_sql, 0
Com_flush, 6
Com_grant, 0
Com_ha_close, 0
Com_ha_open, 0
Com_ha_read, 0
Com_help, 0
Com_insert, 2376493
Com_insert_select, 2
Com_install_plugin, 0
Com_kill, 9757
Com_load, 0
Com_lock_tables, 0
Com_optimize, 0
Com_preload_keys, 0
Com_prepare_sql, 0
Com_purge, 0
Com_purge_before_date, 0
Com_release_savepoint, 0
Com_rename_table, 0
Com_rename_user, 0
Com_repair, 0
Com_replace, 351
Com_replace_select, 0
Com_reset, 0
Com_resignal, 0
Com_revoke, 0
Com_revoke_all, 0
Com_rollback, 67359939
Com_rollback_to_savepoint, 0
Com_savepoint, 0
Com_select, 66889461
Com_set_option, 132188966
Com_signal, 0
Com_show_authors, 0
Com_show_binlog_events, 0
Com_show_binlogs, 21
Com_show_charsets, 5090
Com_show_collations, 1344
Com_show_contributors, 0
Com_show_create_db, 0
Com_show_create_event, 0
Com_show_create_func, 0
Com_show_create_proc, 0
Com_show_create_table, 20611
Com_show_create_trigger, 0
Com_show_databases, 207
Com_show_engine_logs, 0
Com_show_engine_mutex, 0
Com_show_engine_status, 2
Com_show_events, 0
Com_show_errors, 0
Com_show_fields, 12249
Com_show_function_status, 27
Com_show_grants, 6
Com_show_keys, 361
Com_show_master_status, 19
Com_show_open_tables, 0
Com_show_plugins, 0
Com_show_privileges, 0
Com_show_procedure_status, 27
Com_show_processlist, 381
Com_show_profile, 0
Com_show_profiles, 0
Com_show_relaylog_events, 0
Com_show_slave_hosts, 0
Com_show_slave_status, 3
Com_show_status, 8077
Com_show_storage_engines, 14
Com_show_table_status, 11
Com_show_tables, 838
Com_show_triggers, 82
Com_show_variables, 13196
Com_show_warnings, 0
Com_slave_start, 0
Com_slave_stop, 0
Com_stmt_close, 536
Com_stmt_execute, 536
Com_stmt_fetch, 0
Com_stmt_prepare, 536
Com_stmt_reprepare, 0
Com_stmt_reset, 0
Com_stmt_send_long_data, 0
Com_truncate, 0
Com_uninstall_plugin, 0
Com_unlock_tables, 3
Com_update, 174401
Com_update_multi, 0
Com_xa_commit, 0
Com_xa_end, 0
Com_xa_prepare, 0
Com_xa_recover, 0
Com_xa_rollback, 0
Com_xa_start, 0
Compression, OFF
Connections, 33107958
Created_tmp_disk_tables, 15056
Created_tmp_files, 3067
Created_tmp_tables, 76714
Delayed_errors, 0
Delayed_insert_threads, 0
Delayed_writes, 0
Flush_commands, 5
Handler_commit, 42098418
Handler_delete, 50581
Handler_discover, 0
Handler_prepare, 8244948
Handler_read_first, 187940
Handler_read_key, 210889806
Handler_read_last, 2562
Handler_read_next, 235534577
Handler_read_prev, 944581109
Handler_read_rnd, 1984245
Handler_read_rnd_next, 4128983877
Handler_rollback, 32895675
Handler_savepoint, 0
Handler_savepoint_rollback, 0
Handler_update, 35296124
Handler_write, 31003805
Innodb_buffer_pool_pages_data, 262063
Innodb_buffer_pool_pages_dirty, 181
Innodb_buffer_pool_pages_flushed, 1073914
Innodb_buffer_pool_pages_free, 0
Innodb_buffer_pool_pages_misc, 81
Innodb_buffer_pool_pages_total, 262144
Innodb_buffer_pool_read_ahead_rnd, 0
Innodb_buffer_pool_read_ahead, 573918785
Innodb_buffer_pool_read_ahead_evicted, 465869
Innodb_buffer_pool_read_requests, 1583154591
Innodb_buffer_pool_reads, 6918613
Innodb_buffer_pool_wait_free, 0
Innodb_buffer_pool_write_requests, 23935481
Innodb_data_fsyncs, 4531875
Innodb_data_pending_fsyncs, 1
Innodb_data_pending_reads, 0
Innodb_data_pending_writes, 0
Innodb_data_read, 3315879936
Innodb_data_reads, 580850961
Innodb_data_writes, 5054458
Innodb_data_written, 46713856
Innodb_dblwr_pages_written, 536957
Innodb_dblwr_writes, 18531
Innodb_have_atomic_builtins, ON
Innodb_log_waits, 0
Innodb_log_write_requests, 3243758
Innodb_log_writes, 4481087
Innodb_os_log_fsyncs, 4496724
Innodb_os_log_pending_fsyncs, 1
Innodb_os_log_pending_writes, 0
Innodb_os_log_written, 3918738944
Innodb_page_size, 16384
Innodb_pages_created, 47610
Innodb_pages_read, 580851446
Innodb_pages_written, 536957
Innodb_row_lock_current_waits, 0
Innodb_row_lock_time, 8749
Innodb_row_lock_time_avg, 11
Innodb_row_lock_time_max, 114
Innodb_row_lock_waits, 771
Innodb_rows_deleted, 50581
Innodb_rows_inserted, 4969966
Innodb_rows_read, 2753561383
Innodb_rows_updated, 582607
Innodb_truncated_status_writes, 0
Key_blocks_not_flushed, 0
Key_blocks_unused, 6698
Key_blocks_used, 261
Key_read_requests, 2125947
Key_reads, 36
Key_write_requests, 198899
Key_writes, 0
Last_query_cost, 0.000000
Max_used_connections, 94
Not_flushed_delayed_rows, 0
Open_files, 3
Open_streams, 0
Open_table_definitions, 400
Open_tables, 43
Opened_files, 208257
Opened_table_definitions, 87043
Opened_tables, 92483
Performance_schema_cond_classes_lost, 0
Performance_schema_cond_instances_lost, 0
Performance_schema_file_classes_lost, 0
Performance_schema_file_handles_lost, 0
Performance_schema_file_instances_lost, 0
Performance_schema_locker_lost, 0
Performance_schema_mutex_classes_lost, 0
Performance_schema_mutex_instances_lost, 0
Performance_schema_rwlock_classes_lost, 0
Performance_schema_rwlock_instances_lost, 0
Performance_schema_table_handles_lost, 0
Performance_schema_table_instances_lost, 0
Performance_schema_thread_classes_lost, 0
Performance_schema_thread_instances_lost, 0
Prepared_stmt_count, 0
Qcache_free_blocks, 0
Qcache_free_memory, 0
Qcache_hits, 0
Qcache_inserts, 0
Qcache_lowmem_prunes, 0
Qcache_not_cached, 0
Qcache_queries_in_cache, 0
Qcache_total_blocks, 0
Queries, 304460265
Questions, 303968470
Rpl_status, AUTH_MASTER
Select_full_join, 967
Select_full_range_join, 0
Select_range, 38133
Select_range_check, 0
Select_scan, 228931
Slave_heartbeat_period, 0.000
Slave_open_temp_tables, 0
Slave_received_heartbeats, 0
Slave_retried_transactions, 0
Slave_running, OFF
Slow_launch_threads, 0
Slow_queries, 2533
Sort_merge_passes, 1465
Sort_range, 32838342
Sort_rows, 1875805
Sort_scan, 9814
Ssl_accept_renegotiates, 0
Ssl_accepts, 0
Ssl_callback_cache_hits, 0
Ssl_cipher, 
Ssl_cipher_list, 
Ssl_client_connects, 0
Ssl_connect_renegotiates, 0
Ssl_ctx_verify_depth, 0
Ssl_ctx_verify_mode, 0
Ssl_default_timeout, 0
Ssl_finished_accepts, 0
Ssl_finished_connects, 0
Ssl_session_cache_hits, 0
Ssl_session_cache_misses, 0
Ssl_session_cache_mode, NONE
Ssl_session_cache_overflows, 0
Ssl_session_cache_size, 0
Ssl_session_cache_timeouts, 0
Ssl_sessions_reused, 0
Ssl_used_session_cache_entries, 0
Ssl_verify_depth, 0
Ssl_verify_mode, 0
Ssl_version, 
Table_locks_immediate, 36266242
Table_locks_waited, 0
Tc_log_max_pages_used, 0
Tc_log_page_size, 0
Tc_log_page_waits, 0
Threads_cached, 3
Threads_connected, 27
Threads_created, 8926
Threads_running, 4
Uptime, 159095
Uptime_since_flush_status, 159095

Update 2: Thanks to Rick James, This is the show variables. I don't have access to slow log now. But I will take a look at your website and learn about it.

auto_increment_increment    1
auto_increment_offset   1
autocommit  ON
automatic_sp_privileges ON
back_log    50
basedir C:\Program Files\MySQL\MySQL Server 5.5\
big_tables  OFF
binlog_cache_size   32768
binlog_direct_non_transactional_updates OFF
binlog_format   ROW
binlog_stmt_cache_size  32768
bulk_insert_buffer_size 8388608
character_set_client    utf8mb4
character_set_connection    utf8mb4
character_set_database  utf8
character_set_filesystem    binary
character_set_results   utf8mb4
character_set_server    utf8
character_set_system    utf8
character_sets_dir  C:\Program Files\MySQL\MySQL Server 5.5\share\charsets\
collation_connection    utf8mb4_general_ci
collation_database  utf8_general_ci
collation_server    utf8_general_ci
completion_type NO_CHAIN
concurrent_insert   AUTO
connect_timeout 10
datadir C:\ProgramData\MySQL\MySQL Server 5.5\data\
date_format %Y-%m-%d
datetime_format %Y-%m-%d %H:%i:%s
default_storage_engine  InnoDB
default_week_format 0
delay_key_write ON
delayed_insert_limit    100
delayed_insert_timeout  300
delayed_queue_size  1000
div_precision_increment 4
engine_condition_pushdown   ON
error_count 0
event_scheduler OFF
expire_logs_days    0
external_user   
flush   OFF
flush_time  1800
foreign_key_checks  ON
ft_boolean_syntax   + -><()~*:""&|
ft_max_word_len 84
ft_min_word_len 4
ft_query_expansion_limit    20
ft_stopword_file    (built-in)
general_log OFF
general_log_file    C:\ProgramData\MySQL\MySQL Server 5.5\data\PC.log
group_concat_max_len    1024
have_compress   YES
have_crypt  NO
have_csv    YES
have_dynamic_loading    YES
have_geometry   YES
have_innodb YES
have_ndbcluster NO
have_openssl    DISABLED
have_partitioning   YES
have_profiling  YES
have_query_cache    YES
have_rtree_keys YES
have_ssl    DISABLED
have_symlink    YES
hostname    Vibrant7-PC
identity    0
ignore_builtin_innodb   OFF
init_connect    
init_file   
init_slave  
innodb_adaptive_flushing    ON
innodb_adaptive_hash_index  ON
innodb_additional_mem_pool_size 33554432
innodb_autoextend_increment 8
innodb_autoinc_lock_mode    1
innodb_buffer_pool_instances    1
innodb_buffer_pool_size 4294967296
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  1
innodb_flush_method 
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  16777216
innodb_log_file_size    1073741824
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_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   25
innodb_thread_sleep_delay   10000
innodb_use_native_aio   ON
innodb_use_sys_malloc   ON
innodb_version  1.1.8
innodb_write_io_threads 4
insert_id   0
interactive_timeout 28800
join_buffer_size    131072
keep_files_on_create    OFF
key_buffer_size 8388608
key_cache_age_threshold 300
key_cache_block_size    1024
key_cache_division_limit    100
large_files_support ON
large_page_size 0
large_pages OFF
last_insert_id  0
lc_messages en_US
lc_messages_dir C:\Program Files\MySQL\MySQL Server 5.5\share\
lc_time_names   en_US
license GPL
local_infile    ON
lock_wait_timeout   31536000
log OFF
log_bin ON
log_bin_trust_function_creators OFF
log_error   C:\ProgramData\MySQL\MySQL Server 5.5\data\PC.err
log_output  FILE
log_queries_not_using_indexes   OFF
log_slave_updates   OFF
log_slow_queries    OFF
log_warnings    1
long_query_time 10.000000
low_priority_updates    OFF
lower_case_file_system  ON
lower_case_table_names  1
max_allowed_packet  1048576
max_binlog_cache_size   18446744073709547520
max_binlog_size 1073741824
max_binlog_stmt_cache_size  18446744073709547520
max_connect_errors  10
max_connections 100
max_delayed_threads 20
max_error_count 64
max_heap_table_size 16777216
max_insert_delayed_threads  20
max_join_size   18446744073709551615
max_length_for_sort_data    1024
max_long_data_size  1048576
max_prepared_stmt_count 16382
max_relay_log_size  0
max_seeks_for_key   4294967295
max_sort_length 1024
max_sp_recursion_depth  0
max_tmp_tables  32
max_user_connections    0
max_write_lock_count    4294967295
metadata_locks_cache_size   1024
min_examined_row_limit  0
multi_range_count   256
myisam_data_pointer_size    6
myisam_max_sort_file_size   107374182400
myisam_mmap_size    18446744073709551615
myisam_recover_options  OFF
myisam_repair_threads   1
myisam_sort_buffer_size 2147483648
myisam_stats_method nulls_unequal
myisam_use_mmap OFF
named_pipe  OFF
net_buffer_length   16384
net_read_timeout    30
net_retry_count 10
net_write_timeout   60
new OFF
old OFF
old_alter_table OFF
old_passwords   OFF
open_files_limit    2670
optimizer_prune_level   1
optimizer_search_depth  62
optimizer_switch    index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on
performance_schema  OFF
performance_schema_events_waits_history_long_size   10000
performance_schema_events_waits_history_size    10
performance_schema_max_cond_classes 80
performance_schema_max_cond_instances   1000
performance_schema_max_file_classes 50
performance_schema_max_file_handles 32768
performance_schema_max_file_instances   10000
performance_schema_max_mutex_classes    200
performance_schema_max_mutex_instances  1000000
performance_schema_max_rwlock_classes   30
performance_schema_max_rwlock_instances 1000000
performance_schema_max_table_handles    100000
performance_schema_max_table_instances  50000
performance_schema_max_thread_classes   50
performance_schema_max_thread_instances 1000
pid_file    C:\ProgramData\MySQL\MySQL Server 5.5\data\PC.pid
plugin_dir  C:\Program Files\MySQL\MySQL Server 5.5\lib\plugin\
port    3306
preload_buffer_size 32768
profiling   OFF
profiling_history_size  15
protocol_version    10
proxy_user  
pseudo_thread_id    40772511
query_alloc_block_size  8192
query_cache_limit   1048576
query_cache_min_res_unit    4096
query_cache_size    0
query_cache_type    ON
query_cache_wlock_invalidate    OFF
query_prealloc_size 8192
rand_seed1  0
rand_seed2  0
range_alloc_block_size  4096
read_buffer_size    65536
read_only   OFF
read_rnd_buffer_size    262144
relay_log   
relay_log_index 
relay_log_info_file relay-log.info
relay_log_purge ON
relay_log_recovery  OFF
relay_log_space_limit   0
report_host 
report_password 
report_port 3306
report_user 
rpl_recovery_rank   0
secure_auth OFF
secure_file_priv    
server_id   1
shared_memory   OFF
shared_memory_base_name MYSQL
skip_external_locking   ON
skip_name_resolve   OFF
skip_networking OFF
skip_show_database  OFF
slave_compressed_protocol   OFF
slave_exec_mode STRICT
slave_load_tmpdir   C:\Windows\TEMP
slave_net_timeout   3600
slave_skip_errors   OFF
slave_transaction_retries   10
slave_type_conversions  
slow_launch_time    2
slow_query_log  OFF
slow_query_log_file C:\ProgramData\MySQL\MySQL Server 5.5\data\PC-slow.log
socket  MySQL
sort_buffer_size    262144
sql_auto_is_null    OFF
sql_big_selects ON
sql_big_tables  OFF
sql_buffer_result   OFF
sql_log_bin ON
sql_log_off OFF
sql_low_priority_updates    OFF
sql_max_join_size   18446744073709551615
sql_mode    STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
sql_notes   ON
sql_quote_show_create   ON
sql_safe_updates    ON
sql_select_limit    18446744073709551615
sql_slave_skip_counter  0
sql_warnings    OFF
ssl_ca  
ssl_capath  
ssl_cert    
ssl_cipher  
ssl_key 
storage_engine  InnoDB
stored_program_cache    256
sync_binlog 0
sync_frm    ON
sync_master_info    0
sync_relay_log  0
sync_relay_log_info 0
system_time_zone    Pacific Daylight Time
table_definition_cache  400
table_open_cache    256
thread_cache_size   8
thread_concurrency  10
thread_handling one-thread-per-connection
thread_stack    262144
time_format %H:%i:%s
time_zone   SYSTEM
timed_mutexes   OFF
timestamp   1630002865
tmp_table_size  543162368
tmpdir  C:\Windows\TEMP
transaction_alloc_block_size    8192
transaction_prealloc_size   4096
tx_isolation    REPEATABLE-READ
unique_checks   ON
updatable_views_with_limit  YES
version 5.5.21-log
version_comment MySQL Community Server (GPL)
version_compile_machine x86
version_compile_os  Win64
wait_timeout    28800
warning_count   0
2
  • Quick wins - increase your table_open_cache, table_definition_cache, and thread_cache_size. See how many time opens/create threads per sec are happening. Looking at Innodb_buffer_pool_read_requests vs Innodb_buffer_pool_reads shows there is sufficient buffer pool size. Threads_connected(27),Threads_running(4) tell me that its a slow time of day, or the Max_used_connections is an anomaly (guessing connections waiting on table cache). I'd base the new hardware calculations of the actual memory/cpu used in your current situation.
    – danblack
    Aug 26, 2021 at 4:58
  • Comments should only be used for asking for clarification, or to leave constructive criticism that guides the author in improving the post, or to add relevant but minor or transient information to a post (e.g. a link to a related question, or an alert to the author that the question has been updated), or to provide site usage guidance. See the help for details.
    – Hannah Vernon
    Aug 26, 2021 at 12:34

3 Answers 3

1

Analysis of GLOBAL STATUS and VARIABLES:

Observations:

  • Version: 5.5.21-log
  • 512 GB of RAM
  • Uptime = 1d 20:11:35
  • You are running on Windows.
  • Running 32-bit version
  • You appear to be running entirely (or mostly) InnoDB.

The More Important Issues:

MySQL 5.5 is quite old; recommend you upgrade. Suggest upgrading to 5.6, then 5.7. After that comes 8.0, which is a more significant upgrade.

SERIOUS PROBLEM: You seem to be running a 32-bit version of MySQL. It cannot use more than 4GB, and setting the buffer_pool to 4G may cause crashes. While upgrading, be sure to get a 64-bit version. You won't be able to use more than 4GB of the 512GB; what a waste!

Increase innodb_buffer_pool_size (as already mentioned)

If the disk is SSD, several IO settings can be increased; see below

There seem to be a huge number of ROLLBACKs; check into this. Keep in mind that some rollbacks can be caused by disconnects or aborts.

It is better to have innodb_file_per_table = ON, at least when creating large tables.

249 "admin" commands per second (13% of Queries) -- This is quite excessive; what is going on?

SET is being executed about twice as often as SELECT. What is going on?

max_connections = 100 and Max_used_connections is 94. The system has come close to running out of connections.

Details and other observations:

( innodb_buffer_pool_size ) = 4,096M / 524288M = 0.78% -- % of RAM used for InnoDB buffer_pool -- Set to about 70% of available RAM. (To low is less efficient; too high risks swapping.)

( innodb_buffer_pool_size / innodb_buffer_pool_instances ) = 4096M / 1 = 4096MB -- Size of each buffer_pool instance. -- An instance should be at least 1GB. In very large RAM, have 16 instances.

( innodb_io_capacity ) = 200 -- When flushing, use this many IOPs. -- Reads could be slugghish or spiky.

( Innodb_pages_read / Innodb_buffer_pool_read_requests ) = 580,851,446 / 1583154591 = 36.7% -- Read requests that had to hit disk -- Increase innodb_buffer_pool_size (now 4294967296)

( Innodb_log_writes ) = 4,481,087 / 159095 = 28 /sec

( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 159,095 / 60 * 1024M / 3918738944 = 726 -- Minutes between InnoDB log rotations Beginning with 5.6.8, this can be changed dynamically; be sure to also change my.cnf. -- (The recommendation of 60 minutes between rotations is somewhat arbitrary.) Adjust innodb_log_file_size (now 1073741824). (Cannot change in AWS.)

( innodb_flush_method ) = innodb_flush_method = -- How InnoDB should ask the OS to write blocks. Suggest O_DIRECT or O_ALL_DIRECT (Percona) to avoid double buffering. (At least for Unix.) See chrischandler for caveat about O_ALL_DIRECT

( Com_rollback ) = 67,359,939 / 159095 = 423 /sec -- ROLLBACKs in InnoDB. -- An excessive frequency of rollbacks may indicate inefficient app logic.

( Handler_rollback ) = 32,895,675 / 159095 = 206 /sec -- Why so many rollbacks?

( innodb_file_per_table ) = innodb_file_per_table = OFF -- Put each file in its own tablespace -- (Mildly recommended, especially for large tables)

( innodb_additional_mem_pool_size ) = 32M -- (deprecated in 5.6.3, removed in 5.7.4.) -- A high value is unnecessary.

( ( Innodb_pages_read + Innodb_pages_written ) / Uptime / innodb_io_capacity ) = ( 580851446 + 536957 ) / 159095 / 200 = 1827.2% -- If > 100%, need more io_capacity. -- Increase innodb_io_capacity (now 200) if the drives can handle it.

( innodb_io_capacity ) = 200 -- I/O ops per second capable on disk . 100 for slow drives; 200 for spinning drives; 1000-2000 for SSDs; multiply by RAID factor.

( innodb_stats_on_metadata ) = innodb_stats_on_metadata = ON -- Re-analyze table when touching stats. -- ON is likely to slow down certain SHOWs and information_schema accesses, especially in 5.1 and 5.5

( innodb_strict_mode ) = innodb_strict_mode = OFF -- Catches some subtle errors earlier. -- OFF leaves some warnings as warnings; ON makes them errors.

( sync_binlog ) = 0 -- Use 1 for added security, at some cost of I/O =1 may lead to lots of "query end"; =0 may lead to "binlog at impossible position" and lose transactions in a crash, but is faster. 0 is OK for Galera.

( innodb_adaptive_hash_index ) = innodb_adaptive_hash_index = ON -- Usually should be ON. -- There are cases where OFF is better. See also innodb_adaptive_hash_index_parts (after 5.7.9) and innodb_adaptive_hash_index_partitions (MariaDB and Percona). ON has been implicated in rare crashes (bug 73890). 10.5.0 decided to default OFF.

( Handler_rollback/Questions ) = 32,895,675/303968470 = 10.8% -- Rollbacks/query -- Why so many ROLLBACKs?

( _64bit ) = _64bit = 32 -- 32- or 64-bit mysqld -- These days it is rare to run 32-bit. Some limits may be hit, especially on Windows.

( character_set_server ) = character_set_server = utf8 -- Charset problems may be helped by setting character_set_server (now utf8) to utf8mb4. That is the future default.

( local_infile ) = local_infile = ON -- local_infile (now ON) = ON is a potential security issue

( bulk_insert_buffer_size ) = 8 / 524288M = 0.00% -- Buffer for multi-row INSERTs and LOAD DATA -- Too big could threaten RAM size. Too small could hinder such operations.

( tmp_table_size ) = 518M -- Limit on size of MEMORY temp tables used to support a SELECT -- Decrease tmp_table_size (now 543162368) to avoid running out of RAM. Perhaps no more than 64M.

( Com_rollback / (Com_commit + Com_rollback) ) = 67,359,939 / (1719583 + 67359939) = 97.5% -- Rollback : Commit ratio -- Rollbacks are costly; change app logic

( (Com_insert + Com_update + Com_delete + Com_replace) / Com_commit ) = (2376493 + 174401 + 8943 + 351) / 1719583 = 1.49 -- Statements per Commit (assuming all InnoDB) -- Low: Might help to group queries together in transactions; High: long transactions strain various things.

( Com_admin_commands ) = 39,693,518 / 159095 = 249 /sec -- Why so many DDL statements?

( Com_admin_commands / Queries ) = 39,693,518 / 304460265 = 13.0% -- Percent of queries that are "admin" commands. -- What's going on?

( Com_set_option / Com_select ) = 132,188,966 / 66889461 = 197.6% -- It seems 'wrong' to do more SETs than SELECTs.

( Com__biggest ) = Com__biggest = Com_set_option -- Which of the "Com_" metrics is biggest. -- Normally it is Com_select (now 66889461). If something else, then it may be a sloppy platform, or may be something else.

( log_slow_queries ) = log_slow_queries = OFF -- Whether to log slow queries. (Before 5.1.29, 5.6.1)

( slow_query_log ) = slow_query_log = OFF -- Whether to log slow queries. (5.1.12)

( long_query_time ) = 10 -- Cutoff (Seconds) for defining a "slow" query. -- Suggest 2

( back_log ) = 50 -- (Autosized as of 5.6.6; based on max_connections) -- Raising to min(150, max_connections (now 100)) may help when doing lots of connections.

( Connections ) = 33,107,958 / 159095 = 208 /sec -- Connections -- Increase wait_timeout (now 28800); use pooling?

You have the Query Cache half-off. You should set both query_cache_type = OFF and query_cache_size = 0 . There is (according to a rumor) a 'bug' in the QC code that leaves some code on unless you turn off both of those settings.

Abnormally small:

10 * read_buffer_size = 0.6MB
Innodb_data_written = 293 /sec
Open_tables = 43

Abnormally large:

( Innodb_pages_read + Innodb_pages_written ) / Uptime = 3,654
Com_commit + Com_rollback = 434 /sec
Com_kill = 0.061 /sec
Com_set_option = 830 /sec
Com_show_charsets = 0.032 /sec
Com_show_databases = 4.7 /HR
Com_show_storage_engines = 0.32 /HR
Innodb_buffer_pool_read_ahead = 3607 /sec
Innodb_data_reads = 3650 /sec
Innodb_log_writes / Innodb_log_write_requests = 138.1%
Innodb_pages_read = 3650 /sec
Innodb_pages_read + Innodb_pages_written = 3654 /sec
Sort_range = 206 /sec
innodb_thread_concurrency = 25
net_buffer_length / max_allowed_packet = 1.6%

Abnormal strings:

datetime_format = %Y-%m-%d, %H:%i:%s
ft_boolean_syntax = +, -><()~*:&
have_crypt = NO
innodb_fast_shutdown = 1
lower_case_file_system = ON
lower_case_table_names = 1
sql_safe_updates = ON
version_compile_machine = x86
2
  • Thanks! This answer is very helpful to me. I will buy you a banana milk on your website. The ram I just asked is actually 64GB (planning on buying a 512 GB one). I will try to optimize the queries.
    – Zichzheng
    Aug 26, 2021 at 23:40
  • @Zichzheng - Thanks. I don't think the 64G will change any of my recommendations other than being sure that innodb_buffer_pool_size is no more than about 45G.
    – Rick James
    Aug 27, 2021 at 0:48
1

Short Answer:

  • Drastically increase innodb_buffer_pool_size -- This may solve your performance problem for now.
  • Activate and analyze the slowlog -- This may help with problems that are waiting to bite you on your busy system.
  • Provide SHOW VARIABLES -- I can analyze things further.

Long Answer:

If this is server is entirely for MySQL, and if the 160GB of data is expected to grow, set innodb_buffer_pool_size = 400G. (Meanwhile, the 512GB of RAM will mostly be wasted. 256G RAM with 200G buffer_pool will run as fast for now.) Note that the 54.7G includes the 4G buffer_pool; that is, only 50G is potentially used for other things.

We need SHOW VARIABLES -- Most of the STATUS readings cannot be judged without the 'variables'.

The formula for "max memory" does say that some things could be increased, but it is both too small and too high. Theoretically the memory usage could go beyond 54.7G, but in practical usage, it will never get anywhere near that high. (There is no practical formula.)

The most important setting for a new MySQL server is innodb_buffer_pool_size. It should be tuned to your RAM size (70% is generally good; the 80% I am suggesting is good for such big RAMs). Meanwhile, do not change any other settings until there is specific info pointing at something else to tune.

Max_used_connections is a "high-water-mark". 94 either means there are a lot of useful clients running (at some point since startup), or that things are misconfigured elsewhere. If it hits the VARIABLE max_connections, then clients will get error messages.

2K queries per second -- a relatively busy system.

Com_admin_commands = 300 per second. That is extremely high. Can you explain? Several other Com_% metrics are also abnormally high.

"really slow" -- The VARIABLES will help. So would the slowlog. Set long_query_time = 1and turn on the slowlog, write to FILE, summarize viapt-query-digest`. (More details: http://mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog )

"cannot hold more than 100 connections" -- A busy, well-tuned, server does not need even 100 connections. Is it a web app? Something else? The slowlog will help say why connections are taking too long. If the connections are quitting "too soon", well, that is not consistent with what you have been saying. So what do you mean by "cannot hold"?

3
  • Thank you very much! I have updated the show variables.
    – Zichzheng
    Aug 26, 2021 at 18:54
  • I don't have access to slow log right now. But I think, the reason why It has this many of connection is because we have some instruments writing and reading data into the database(They are constant). And other people will use an internal website to place order, update things. Those queries are light. But also, there are people analyzing the data. Usually their queries took a lot of time since they need to compare historical data.
    – Zichzheng
    Aug 26, 2021 at 19:29
  • @Zichzheng - If the "analysis" queries become a burden, consider building an maintaining "summary tables" so that they can be much faster -- mysql.rjweb.org/doc.php/summarytables
    – Rick James
    Aug 26, 2021 at 19:31
1

Rate Per Second = RPS Suggestions to consider in your my.ini [mysqld] section to improve performance of this 5.5.21 instance.

max_heap_table_size=543162368  # from 16M to match tmp_table_size and reduce created_tmp_disk_tables RPhr of 341
thread_cache_size=64  # from 8 to reduce threads_created RPhr of 202
read_rnd_buffer_size=131072  # from 262144 to reduce handler_read_rnd_next RPS of 25,953
innodb_concurrency_tickets=10000  # from 500 to reduce reque frequency

There are many other opportunities to improve performance with your instance.

Observations, com_rollback of more than 67 million in 2 days indicates serious troubles. General Log analysis could help identify likely causes. Why 6 com_flush events in 2 days? Could cause table open thrashing. select_scan count of 228,921 in 2 days indicates indexes are needed. log_queries_not_using_indexes appropriate use could identify tables needing indexes.

1
  • I will take over this database next week, I will take a deep look into it. Thanks for your analysis, I will try to identify the rollback and the flush events problem.
    – Zichzheng
    Aug 28, 2021 at 0:10

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.