Mysql

為什麼 InnoDB 上的簡單 SELECT 比 MyISAM 慢 100 倍?

  • December 31, 2021

我有一個很煩人的問題。我想使用 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_pa​​cket = 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_pa​​cket = 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_pa​​ges | 開 |
| 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_pa​​ges | 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_pa​​ges | 關閉 |
| 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 架構。

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_2threadid_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

試一試 !!!

引用自:https://dba.stackexchange.com/questions/75091