系統瓶頸多在資料庫端。少量資料/低併發無需技巧,但資料量達標後,每個設計細節都影響效能。
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事務支援 | 無 | 完整 ACID |
| 外鍵 | 無 | 支援 |
| 鎖粒度 | 表鎖 | 行鎖 |
| 讀取速度 | 極快 | 較慢 |
| 批量插入 | 極快 | 較慢 |
| 磁碟佔用 | 較小 | 較大(含 undo log) |
| 崩潰恢復 | 需人工修復 | 自動恢復 |
SELECT、INSERT 為主、無事務需求 → MyISAMCHAR(100) 前 10 字元唯一 → INDEX idx_col (col(10)),加快查詢、省空間INDEX (a,b,c) 等效於 (a)、(a,b)、(a,b,c) 三個索引,查詢必須包含最左列才會用到SHOW INDEX FROM user;
-- 聯合索引 user(username, `order`, email)
EXPLAIN SELECT * FROM user WHERE username='leehui'; -- 用到索引
EXPLAIN SELECT * FROM user WHERE `order`=1; -- 未用到(非最左)
EXPLAIN SELECT * FROM user WHERE username LIKE 'lee%'; -- 索引生效 (range)
EXPLAIN SELECT * FROM user WHERE username LIKE '%lee'; -- 索引失效 (ALL)
只有 % 不在首位 時索引才可能生效。
SHOW STATUS LIKE 'Handler_read_key'; -- 高 = 索引生效
SHOW STATUS LIKE 'Handler_read_rnd_next'; -- 高 = 全表掃描,索引失效
-- 慢:N 條 INSERT
INSERT INTO test VALUES (a,b);
INSERT INTO test VALUES (c,d);
-- 快:單條多值
INSERT INTO test VALUES (a,b), (c,d), (e,f);
mysql_insert_id() 無效(尚未真實寫入);關鍵資料勿用(掉電丟失風險)ALTER TABLE user MAX_ROWS=1000000000 AVG_ROW_LENGTH=15000;
預設 4GB,修改後支援 ~208TB。