為什麼 InnoDB 上的簡單 SELECT 比 MyISAM 慢 100 倍?
我有一個很煩人的問題。我想使用 INNODB 作為我的主數據庫引擎並放棄 MyISAM,因為我需要前者來使用 galera-cluster 進行冗餘。
我將表複製(如下描述)
newbb_post
到一個名為的新表newbb_innopost
並將其更改為 InnoDB。這些表目前5,390,146
每個都包含條目。在新啟動的數據庫上執行這些選擇(因此此時不涉及記憶體!)數據庫產生以下結果(省略完整輸出,請注意我什至不要求數據庫對結果進行排序):
SELECT post.postid, post.attach FROM newbb_post AS post WHERE post.threadid = 51506; . . | 5401593 | 0 | | 5401634 | 0 | +---------+--------+ 62510 行(0.13 秒)
選擇 post.postid, post.attach FROM newbb_innopost AS post WHERE post.threadid = 51506; . . | 5397410 | 0 | | 5397883 | 0 | +---------+--------+ 62510 行(1 分 22.19 秒)
0.13 秒到 86.19 秒 (!)
我想知道為什麼會這樣。我確實在涉及 InnoDB 的 Stackexchange 上閱讀了一些答案,有些人建議將
innodb_buffer_pool
大小增加到已安裝 RAM 的 80%。這不會解決問題,對特定 ID 的初始查詢將花費至少 50 倍的時間,並且會停止整個網路伺服器,排隊連接和查詢數據庫。之後記憶體/緩衝區可能會啟動,但該數據庫中有超過 100.000 個執行緒,因此記憶體很可能永遠不會保存所有要服務的相關查詢。上面的查詢很簡單(沒有連接),並且使用了所有鍵:
EXPLAIN SELECT post.postid, post.attach FROM newbb_innopost AS post WHERE post.threadid = 51506; +------+-------------+-------+------+-----------------------------------------------+----------+---------+-------+--------+-------+ | 編號 | 選擇類型 | 表| 類型 | 可能的鍵 | 關鍵 | key_len | 參考 | 行 | 額外 | +------+-------------+-------+------+-----------------------------------------------+----------+---------+-------+--------+-------+ | 1 | 簡單 | 發布 | 參考 | threadid,threadid_2,threadid_visible_dateline | 執行緒ID | 4 | 常量 | 120144 | | +------+-------------+-------+------+-----------------------------------------------+----------+---------+-------+--------+-------+
這是 MyISAM 表:
創建表`newbb_post`( `postid` int(10) unsigned NOT NULL AUTO_INCREMENT, `threadid` int(10) unsigned NOT NULL DEFAULT '0', `parentid` int(10) unsigned NOT NULL DEFAULT '0', `username` varchar(100) NOT NULL DEFAULT '', `userid` int(10) unsigned NOT NULL DEFAULT '0', `title` varchar(250) NOT NULL DEFAULT '', `dateline` int(10) unsigned NOT NULL DEFAULT '0', `pagetext` 中文本, `allowsmilie` smallint(6) NOT NULL DEFAULT '0', `showsignature` smallint(6) NOT NULL DEFAULT '0', `ipaddress` varchar(15) NOT NULL DEFAULT '', `iconid` smallint(5) unsigned NOT NULL DEFAULT '0', `visible` smallint(6) NOT NULL DEFAULT '0', `attach` smallint(5) unsigned NOT NULL DEFAULT '0', `infraction` smallint(5) unsigned NOT NULL DEFAULT '0', `reportthreadid` int(10) unsigned NOT NULL DEFAULT '0', `importthreadid` bigint(20) NOT NULL DEFAULT '0', `importpostid` bigint(20) NOT NULL DEFAULT '0', `converted_2_utf8` int(11) NOT NULL, `htmlstate` enum('off','on','on_nl2br') NOT NULL DEFAULT 'on_nl2br', 主鍵(`postid`), KEY `threadid` (`threadid`,`userid`), KEY `importpost_index`(`importpostid`), KEY `dateline` (`dateline`), KEY `threadid_2` (`threadid`,`visible`,`dateline`), KEY `converted_2_utf8` (`converted_2_utf8`), KEY `threadid_visible_dateline` (`threadid`,`visible`,`dateline`,`userid`,`postid`), KEY `ipaddress` (`ipaddress`), KEY `userid` (`userid`,`parentid`), KEY `user_date` (`userid`,`dateline`) ) 引擎=MyISAM AUTO_INCREMENT=5402802 預設字元集=latin1
這是 InnoDB 表(完全相同):
創建表`newbb_innopost`( `postid` int(10) unsigned NOT NULL AUTO_INCREMENT, `threadid` int(10) unsigned NOT NULL DEFAULT '0', `parentid` int(10) unsigned NOT NULL DEFAULT '0', `username` varchar(100) NOT NULL DEFAULT '', `userid` int(10) unsigned NOT NULL DEFAULT '0', `title` varchar(250) NOT NULL DEFAULT '', `dateline` int(10) unsigned NOT NULL DEFAULT '0', `pagetext` 中文本, `allowsmilie` smallint(6) NOT NULL DEFAULT '0', `showsignature` smallint(6) NOT NULL DEFAULT '0', `ipaddress` varchar(15) NOT NULL DEFAULT '', `iconid` smallint(5) unsigned NOT NULL DEFAULT '0', `visible` smallint(6) NOT NULL DEFAULT '0', `attach` smallint(5) unsigned NOT NULL DEFAULT '0', `infraction` smallint(5) unsigned NOT NULL DEFAULT '0', `reportthreadid` int(10) unsigned NOT NULL DEFAULT '0', `importthreadid` bigint(20) NOT NULL DEFAULT '0', `importpostid` bigint(20) NOT NULL DEFAULT '0', `converted_2_utf8` int(11) NOT NULL, `htmlstate` enum('off','on','on_nl2br') NOT NULL DEFAULT 'on_nl2br', 主鍵(`postid`), KEY `threadid` (`threadid`,`userid`), KEY `importpost_index`(`importpostid`), KEY `dateline` (`dateline`), KEY `threadid_2` (`threadid`,`visible`,`dateline`), KEY `converted_2_utf8` (`converted_2_utf8`), KEY `threadid_visible_dateline` (`threadid`,`visible`,`dateline`,`userid`,`postid`), KEY `ipaddress` (`ipaddress`), KEY `userid` (`userid`,`parentid`), KEY `user_date` (`userid`,`dateline`) ) 引擎=InnoDB AUTO_INCREMENT=5402802 預設字元集=latin1
伺服器,32GB RAM:
伺服器版本:10.0.12-MariaDB-1~trusty-wsrep-log mariadb.org 二進制發行版,wsrep_25.10.r4002
如果您需要所有 innodb_ 變數設置,我可以將其附加到這篇文章中。
更新:
我刪除了除主索引之外的所有索引,之後結果如下所示:
. . | 5402697 | 0 | | 5402759 | 0 | +---------+--------+ 62510 行(29.74 秒)
EXPLAIN SELECT post.postid, post.attach FROM newbb_innopost AS post WHERE post.threadid = 51506; +------+-------------+-------+------+---------------+------+---------+------+---------+-------------+ | 編號 | 選擇類型 | 表| 類型 | 可能的鍵 | 關鍵 | key_len | 參考 | 行 | 額外 | +------+-------------+-------+------+---------------+------+---------+------+---------+-------------+ | 1 | 簡單 | 發布 | 全部 | 空 | 空 | 空 | 空 | 5909836 | 使用位置 | +------+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 一組中的 1 行(0.00 秒)
在此之後,我只添加了一個索引,threadid,結果如下:
. . | 5402697 | 0 | | 5402759 | 0 | +---------+--------+ 62510 行(11.58 秒)
EXPLAIN SELECT post.postid, post.attach FROM newbb_innopost AS post WHERE post.threadid = 51506; +------+-------------+-------+------+---------------+----------+---------+-------+--------+-------+ | 編號 | 選擇類型 | 表| 類型 | 可能的鍵 | 關鍵 | key_len | 參考 | 行 | 額外 | +------+-------------+-------+------+---------------+----------+---------+-------+--------+-------+ | 1 | 簡單 | 發布 | 參考 | 執行緒ID | 執行緒ID | 4 | 常量 | 124622 | | +------+-------------+-------+------+---------------+----------+---------+-------+--------+-------+ 一組中的 1 行(0.00 秒)
奇怪的是,在沒有任何相關索引的情況下,與使用索引(!)的 88 秒相比,完全掃描只需要 29 秒。
只有一個完美定制的索引仍然需要 11 秒才能完成 - 對於任何現實世界的使用來說仍然太慢了。
更新 2:
我在另一台具有完全相同的硬體配置和完全相同的數據庫/表的伺服器上設置了 MySQL (5.5.38-0ubuntu0.14.04.1 (Ubuntu))。
結果幾乎一樣,首先是MyISAM表:
. . | 5401593 | 0 | | 5401634 | 0 | +---------+--------+ 62510 行(0.14 秒)
這是 InnoDB 表的結果
. . | 5397410 | 0 | | 5397883 | 0 | +---------+--------+ 62510 行(1 分 17.63 秒)
更新 3: my.cnf 的內容
# MariaDB 數據庫伺服器配置文件。 # # 您可以將此文件複製到以下位置之一: # - "/etc/mysql/my.cnf" 設置全域選項, # - "~/.my.cnf" 設置使用者特定的選項。 # # 可以使用程序支持的所有長選項。 # 使用 --help 執行程序以獲取可用選項的列表,並使用 # --print-defaults 看看它會真正理解和使用哪個。 # # 解釋見 # http://dev.mysql.com/doc/mysql/en/server-system-variables.html # 這將傳遞給所有 mysql 客戶端 # 據報導,密碼應該用刻度/引號括起來 # 特別是如果它們包含“#”字元... # 更改套接字位置時記得編輯/etc/mysql/debian.cnf。 [客戶] 埠 = 3306 套接字 = /var/run/mysqld/mysqld.sock # 這裡是一些特定程序的條目 # 以下值假設您至少有 32M 記憶體 # 這被正式稱為 [safe_mysqld]。這兩個版本目前都已解析。 [mysqld_safe] 套接字 = /var/run/mysqld/mysqld.sock 不錯 = 0 [mysqld] # # * 基本設置 # 使用者 = mysql pid 文件 = /var/run/mysqld/mysqld.pid 套接字 = /var/run/mysqld/mysqld.sock 埠 = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc_messages_dir = /usr/share/mysql lc_messages = en_US 跳過外部鎖定 # # 而不是skip-networking,現在預設是只監聽 # 更兼容且安全性更高的 localhost。 綁定地址 = 127.0.0.1 # # * 微調 # 最大連接數 = 100 連接超時 = 5 等待超時 = 600 max_allowed_packet = 16M 執行緒記憶體大小 = 128 排序緩衝區大小 = 4M bulk_insert_buffer_size = 16M tmp_table_size = 32M max_heap_table_size = 32M # # * MyISAM # # 這將替換啟動腳本並在需要時檢查 MyISAM 表 # 第一次被觸摸。如果出現錯誤,請複制並嘗試修復。 myisam_recover = 備份 key_buffer_size = 128M #open-files-limit = 2000 table_open_cache = 400 myisam_sort_buffer_size = 512M 並發插入 = 2 讀取緩衝區大小 = 2M read_rnd_buffer_size = 1M # # * 查詢記憶體配置 # # 只記憶體很小的結果集,所以我們可以在查詢記憶體中容納更多。 query_cache_limit = 128K query_cache_size = 64M # 對於更多的寫入密集設置,設置為 DEMAND 或 OFF #query_cache_type = 需求 # # * 記錄和複製 # # 這兩個位置都被 cronjob 輪換了。 # 請注意,這種日誌類型是性能殺手。 # 從 5.1 開始,您可以在執行時啟用日誌! #general_log_file = /var/log/mysql/mysql.log #general_log = 1 # # 由於 /etc/mysql/conf.d/mysqld_safe_syslog.cnf,錯誤日誌記錄到 syslog。 # # 我們確實想知道網路錯誤等 日誌警告 = 2 # # 啟用慢查詢日誌以查看持續時間特別長的查詢 #slow_query_log[={0|1}] slow_query_log_file = /var/log/mysql/mariadb-slow.log long_query_time = 10 #log_slow_rate_limit = 1000 log_slow_verbosity = query_plan #log-queries-not-using-indexes #log_slow_admin_statements # # 以下可以作為方便重放備份日誌或用於複製。 # 注意:如果您要設置複製從屬伺服器,請參閱 README.Debian 關於 # 您可能需要更改的其他設置。 #server-id = 1 #report_host = master1 #auto_increment_increment = 2 #auto_increment_offset = 1 log_bin = /var/log/mysql/mariadb-bin log_bin_index = /var/log/mysql/mariadb-bin.index # 性能不高,但更安全 #sync_binlog = 1 expire_logs_days = 10 max_binlog_size = 100M #奴隸 #relay_log = /var/log/mysql/relay-bin #relay_log_index = /var/log/mysql/relay-bin.index #relay_log_info_file = /var/log/mysql/relay-bin.info #log_slave_updates #只讀 # # 如果應用程序支持它,這個更嚴格的 sql_mode 會阻止一些 # 錯誤,例如插入無效日期等。 #sql_mode = NO_ENGINE_SUBSTITUTION,傳統 # # * InnoDB # # InnoDB 預設啟用,在 /var/lib/mysql/ 中有一個 10MB 的數據文件。 # 閱讀手冊以獲取更多與 InnoDB 相關的選項。有許多! default_storage_engine = InnoDB # 你不能只改變日誌文件的大小,需要特殊的程序 #innodb_log_file_size = 50M innodb_buffer_pool_size = 20G innodb_log_buffer_size = 8M innodb_file_per_table = 1 innodb_open_files = 400 innodb_io_capacity = 400 innodb_flush_method = O_DIRECT # # * 安全功能 # # 如果你想要 chroot,也請閱讀手冊! # chroot = /var/lib/mysql/ # # 為了生成 SSL 證書,我推薦使用 OpenSSL GUI “tinyca”。 # # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem [mysql轉儲] 快的 引用名稱 max_allowed_packet = 16M [mysql] #no-auto-rehash # mysql 啟動更快但沒有 tab 完成 [isamchk] key_buffer = 16M # # * 重要提示:可以覆蓋此文件中的其他設置! # 文件必須以 '.cnf' 結尾,否則將被忽略。 # !includedir /etc/mysql/conf.d/
以及 inno 變數的內容:
MariaDB [(none)]> 顯示變數,例如 'inno%'; +-------------------------------------------+------------------------+ | 變數名 | 價值 | +-------------------------------------------+------------------------+ | innodb_adaptive_flushing | 開 | | innodb_adaptive_flushing_lwm | 10 | | innodb_adaptive_hash_index | 開 | | innodb_adaptive_hash_index_partitions | 1 | | innodb_adaptive_max_sleep_delay | 150000 | | innodb_additional_mem_pool_size | 8388608 | | innodb_api_bk_commit_interval | 5 | | innodb_api_disable_rowlock | 關閉 | | innodb_api_enable_binlog | 關閉 | | innodb_api_enable_mdl | 關閉 | | innodb_api_trx_level | 0 | | innodb_autoextend_increment | 64 | | innodb_autoinc_lock_mode | 1 | | innodb_buffer_pool_dump_at_shutdown | 關閉 | | innodb_buffer_pool_dump_now | 關閉 | | innodb_buffer_pool_filename | ib_buffer_pool | | innodb_buffer_pool_instances | 8 | | innodb_buffer_pool_load_abort | 關閉 | | innodb_buffer_pool_load_at_startup | 關閉 | | innodb_buffer_pool_load_now | 關閉 | | innodb_buffer_pool_populate | 關閉 | | innodb_buffer_pool_size | 21474836480 | | innodb_change_buffer_max_size | 25 | | innodb_change_buffering | 全部 | | innodb_checksum_algorithm | innodb | | innodb_checksums | 開 | | innodb_cleaner_lsn_age_factor | 高檢查點 | | innodb_cmp_per_index_enabled | 關閉 | | innodb_commit_concurrency | 0 | | innodb_compression_failure_threshold_pct | 5 | | innodb_compression_level | 6 | | innodb_compression_pad_pct_max | 50 | | innodb_concurrency_tickets | 5000 | | innodb_corrupt_table_action | 斷言 | | innodb_data_file_path | ibdata1:12M:自動擴展 | | innodb_data_home_dir | | | innodb_disable_sort_file_cache | 關閉 | | innodb_doublewrite | 開 | | innodb_empty_free_list_algorithm | 退避 | | innodb_fake_changes | 關閉 | | innodb_fast_shutdown | 1 | | innodb_file_format | 羚羊 | | innodb_file_format_check | 開 | | innodb_file_format_max | 羚羊 | | innodb_file_per_table | 開 | | innodb_flush_log_at_timeout | 1 | | innodb_flush_log_at_trx_commit | 1 | | innodb_flush_method | O_DIRECT | | innodb_flush_neighbors | 1 | | innodb_flushing_avg_loops | 30 | | innodb_force_load_corrupted | 關閉 | | innodb_force_recovery | 0 | | innodb_foreground_preflush | 指數退避 | | innodb_ft_aux_table | | | innodb_ft_cache_size | 8000000 | | innodb_ft_enable_diag_print | 關閉 | | innodb_ft_enable_stopword | 開 | | innodb_ft_max_token_size | 84 | | innodb_ft_min_token_size | 3 | | innodb_ft_num_word_optimize | 2000 | | innodb_ft_result_cache_limit | 2000000000 | | innodb_ft_server_stopword_table | | | innodb_ft_sort_pll_degree | 2 | | innodb_ft_total_cache_size | 640000000 | | innodb_ft_user_stopword_table | | | innodb_io_capacity | 400 | | innodb_io_capacity_max | 2000 | | innodb_kill_idle_transaction | 0 | | innodb_large_prefix | 關閉 | | innodb_lock_wait_timeout | 50 | | innodb_locking_fake_changes | 開 | | innodb_locks_unsafe_for_binlog | 關閉 | | innodb_log_arch_dir | ./ | | innodb_log_arch_expire_sec | 0 | | innodb_log_archive | 關閉 | | innodb_log_block_size | 512 | | innodb_log_buffer_size | 8388608 | | innodb_log_checksum_algorithm | innodb | | innodb_log_compressed_pages | 開 | | innodb_log_file_size | 50331648 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_lru_scan_depth | 1024 | | innodb_max_bitmap_file_size | 104857600 | | innodb_max_changed_pages | 1000000 | | innodb_max_dirty_pages_pct | 75 | | innodb_max_dirty_pages_pct_lwm | 0 | | innodb_max_purge_lag | 0 | | innodb_max_purge_lag_delay | 0 | | innodb_mirrored_log_groups | 1 | | innodb_monitor_disable | | | innodb_monitor_enable | | | innodb_monitor_reset | | | innodb_monitor_reset_all | | | innodb_old_blocks_pct | 37 | | innodb_old_blocks_time | 1000 | | innodb_online_alter_log_max_size | 134217728 | | innodb_open_files | 400 | | innodb_optimize_fulltext_only | 關閉 | | innodb_page_size | 16384 | | innodb_print_all_deadlocks | 關閉 | | innodb_purge_batch_size | 300 | | innodb_purge_threads | 1 | | innodb_random_read_ahead | 關閉 | | innodb_read_ahead_threshold | 56 | | innodb_read_io_threads | 4 | | innodb_read_only | 關閉 | | innodb_replication_delay | 0 | | innodb_rollback_on_timeout | 關閉 | | innodb_rollback_segments | 128 | | innodb_sched_priority_cleaner | 19 | | innodb_show_locks_held | 10 | | innodb_show_verbose_locks | 0 | | innodb_sort_buffer_size | 1048576 | | innodb_spin_wait_delay | 6 | | innodb_stats_auto_recalc | 開 | | innodb_stats_method | nulls_equal | | innodb_stats_on_metadata | 關閉 | | innodb_stats_persistent | 開 | | innodb_stats_persistent_sample_pages | 20 | | innodb_stats_sample_pages | 8 | | innodb_stats_transient_sample_pages | 8 | | innodb_status_output | 關閉 | | innodb_status_output_locks | 關閉 | | innodb_strict_mode | 關閉 | | innodb_support_xa | 開 | | innodb_sync_array_size | 1 | | innodb_sync_spin_loops | 30 | | innodb_table_locks | 開 | | innodb_thread_concurrency | 0 | | innodb_thread_sleep_delay | 10000 | | innodb_track_changed_pages | 關閉 | | innodb_undo_directory | . | | innodb_undo_logs | 128 | | innodb_undo_tablespaces | 0 | | innodb_use_atomic_writes | 關閉 | | innodb_use_fallocate | 關閉 | | innodb_use_global_flush_log_at_trx_commit | 開 | | innodb_use_native_aio | 開 | | innodb_use_stacktrace | 關閉 | | innodb_use_sys_malloc | 開 | | innodb_version | 5.6.17-65.0 | | innodb_write_io_threads | 4 | +-------------------------------------------+------------------------+ 143 行(0.02 秒)
機器的核心數是8,它是一個
Intel(R) Xeon(R) CPU E3-1246 v3 @ 3.50GHz
作為/proc/cpuinfo
最後一點:使用 RolandoMYSQLDBA 建議的索引執行查詢,每個查詢大約需要 11-20 秒。我確實想指出,對我來說至關重要的是(這是公告板的主表),關於 threadid 的第一個查詢會在不到一秒的時間內返回,因為有超過 60.000 個執行緒和 google-bots 不斷爬取這些執行緒。
您的查詢
SELECT post.postid, post.attach FROM newbb_innopost AS post WHERE post.threadid = 51506;
乍一看,該查詢應該只涉及表的 1.1597%(5390146 中的 62510)。考慮到 threadid 51506 的密鑰分配,它應該很快。
現實檢查
無論您使用哪個版本的 MySQL(Oracle、Percona、MariaDB),它們都無法與一個共同的敵人作戰:InnoDB 架構。
聚集索引
請記住,每個 threadid 條目都附加了一個主鍵。這意味著當您從索引中讀取時,它必須在ClusteredIndex(內部命名為 gen_clust_index)中進行主鍵查找。在 ClusteredIndex 中,每個 InnoDB 頁面都包含數據和 PRIMARY KEY 索引資訊。有關更多資訊,請參閱我的博文 Best of MyISAM 和 InnoDB。
冗餘索引
表中有很多混亂,因為某些索引具有相同的前導列。MySQL 和 InnoDB 必須在索引混亂中導航才能到達所需的 BTREE 節點。您應該通過執行以下命令來減少混亂:
ALTER TABLE newbb_innopost DROP INDEX threadid, DROP INDEX threadid_2, DROP INDEX threadid_visible_dateline, ADD INDEX threadid_visible_dateline_index (`threadid`,`visible`,`dateline`,`userid`) ;
為什麼要剝離這些索引?
- 前三個索引以 threadid 開頭
threadid_2
並threadid_visible_dateline
從相同的三列開始threadid_visible_dateline
不需要 postid,因為它是 PRIMARY KEY 並且它是嵌入的緩衝區記憶體
InnoDB 緩衝池記憶體數據和索引頁面。MyISAM 只記憶體索引頁。
僅在這方面,MyISAM 不會浪費時間記憶體數據。那是因為它不是為記憶體數據而設計的。InnoDB 記憶體它接觸到的每個數據頁和索引頁(及其祖母)。如果您的 InnoDB 緩衝池太小,您可能會在一個查詢中記憶體頁面、使頁面無效和刪除頁面。
表格佈局
importthreadid
您可以通過考慮和從行中減少一些空間importpostid
。您將它們作為 BIGINT。它們在每行的 ClusteredIndex 中佔用 16 個字節。你應該執行這個
SELECT importthreadid,importpostid FROM newbb_innopost PROCEDURE ANALYSE();
這將為給定的數據集推薦這些列應該是什麼數據類型。
結論
與 InnoDB 相比,MyISAM 的挑戰要少得多,尤其是在記憶體方面。
雖然您透露了 RAM 的數量 (
32GB
) 和 MySQL 的版本 (Server version: 10.0.12-MariaDB-1~trusty-wsrep-log mariadb.org binary distribution, wsrep_25.10.r4002
),但您還沒有透露這個謎題的其他部分
- InnoDB 設置
- 核心數
- 其他設置來自
my.cnf
如果您可以將這些內容添加到問題中,我可以進一步詳細說明。
更新 2014-08-28 11:27 EDT
你應該增加執行緒
innodb_read_io_threads = 64 innodb_write_io_threads = 16 innodb_log_buffer_size = 256M
我會考慮禁用查詢記憶體(參見我最近的文章Why query_cache_type is disabled by default start from MySQL 5.6?)
query_cache_size = 0
我會保留緩衝池
innodb_buffer_pool_dump_at_shutdown=1 innodb_buffer_pool_load_at_startup=1
增加清除執行緒(如果您在多個表上執行 DML)
innodb_purge_threads = 4
試一試 !!!