經分區存儲、索引優化、參數調優,**9000 萬筆資料單查詢 1-20ms**。但千人併發仍感壓力,優化無終點。
CREATE TABLE tmp_sampledata (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(32), passwd VARCHAR(32), email VARCHAR(64),
nickname VARCHAR(32), siteid VARCHAR(32),
src SMALLINT NOT NULL DEFAULT 0,
PRIMARY KEY (id, src)
) ENGINE=MyISAM DEFAULT CHARSET=gbk
PARTITION BY LIST COLUMNS(src)
SUBPARTITION BY HASH(id) SUBPARTITIONS 5
(PARTITION p1 VALUES IN (1), PARTITION p2 VALUES IN (2), ...);
CREATE INDEX idx_username ON tmp_sampledata(username);
EXPLAIN SELECT id FROM t WHERE username='abc' AND src IN (2,3);
-- rows: 20 (僅掃 2 個分區)
EXPLAIN SELECT id FROM t WHERE username='abc';
-- rows: 80 (掃全 8 分區)
高頻查 `username`、`email` → 改為 **List 分區 src + Key 子分區 (username,email)**
CREATE TABLE tmp_sampledata (
id BIGINT UNSIGNED NOT NULL,
username VARCHAR(32) NOT NULL DEFAULT '',
email VARCHAR(64) NOT NULL DEFAULT '',
...,
src SMALLINT NOT NULL DEFAULT 0
) ENGINE=MyISAM DEFAULT CHARSET=gbk
PARTITION BY LIST COLUMNS(src)
SUBPARTITION BY KEY(username,email) SUBPARTITIONS 10
(PARTITION p1 VALUES IN (1), ...);
**解法**:建表**不帶 PK/UK** → `LOAD DATA` **5 分鐘** → **事後建索引**
SET SESSION myisam_sort_buffer_size = 1048576000; -- 1GB 排序緩衝
CREATE INDEX idx_username_src ON tmp_sampledata(username, src); -- 7 分 13 秒
CREATE INDEX idx_email_src ON tmp_sampledata(email, src); -- 10 分 48 秒
CREATE INDEX idx_src_username_email ON tmp_sampledata(src, username, email); -- 16 分 05 秒
調大 `myisam_sort_buffer_size` 從 8M → 1GB,**建索引速度大幅提升**。
億級表管理核心:**分區策略對齊查詢模式、LOAD DATA 先載入後建索引、調大排序緩衝、接受模糊查詢妥協或引入搜尋引擎**。架構演進永遠在路上。