將大表按邏輯拆分為多個同結構小表,查詢時僅掃描相關分表。
UNION ALL 全表掃描,得不償失-- 查詢 2023 年訂單
SELECT * FROM order_2023 WHERE user_id=100;
將寬表拆為「主表(高頻小字段)」+「副表(低頻大字段)」,一對一關聯。
試題表 3 萬行 1GB,列表頁只查標題、難度,詳情頁才需內容、答案。拆分後列表頁不再掃描大字段,IO 驟降。
-- 主表
CREATE TABLE question (
id INT PRIMARY KEY,
title VARCHAR(200),
difficulty TINYINT,
unit_id INT
);
-- 副表
CREATE TABLE question_content (
qid INT PRIMARY KEY,
content TEXT,
answer TEXT,
FOREIGN KEY (qid) REFERENCES question(id)
);
TINYINT 不用 INT,能用 INT 不用 BIGINT
[mysqld]
innodb_buffer_pool_size = 1G
innodb_additional_mem_pool_size = 64M
key_buffer_size = 256M
default-storage-engine = INNODB
max_connections = 500
port = 3306
Master 負責寫,多 Slave 負責讀。中間件(MyCat、ProxySQL、ShardingSphere)實現透明路由,應用無感知。
# Windows 計劃任務每天 02:00
mysqldump -u root -p db > D:/backup/db_%date%.sql
log-bin=G:/mysqlbinlog/mylog,重啟服務
mysqlbinlog --stop-datetime="2023-10-01 12:00:00" \
G:/mysqlbinlog/mylog.000001 | mysql -u root -p
mysqlbinlog --stop-position="614" \
G:/mysqlbinlog/mylog.000001 | mysql -u root -p
注意:Binlog 僅記錄 DDL/DML,不記錄 SELECT;MySQL 5.0+ 支持。