這份文檔由之前的一份PPT修改而成。其內容可能不適用最新版本的MySQL數據庫。數據庫
SELECT+UPDATE | 80 |
INSERT+DELETE | 20 |
SELECT | 80 |
UPDATE | 20 |
SELECT | 讀鎖 |
UPDATE | 寫鎖 |
MyISAM | 表鎖,衝突機率高,併發低 |
InnoDB | 行鎖,衝突機率低,併發高 |
SET PROFILING=1; SHOW PROFILES; SHOW PROFILE FOR QUERY 1;
加速檢索併發
約束 PRIMARY KEY/UNIQUE KEY/FOREIGN KEY性能
單列索引優化
惟一索引 UNIQUE KEYspa
主鍵索引 PRIMARY KEY設計
組合索引排序
ALTER TABLE tbl ADD INDEX idx1(a, b, c);
實際上創建了3個索引:索引
(a), (a, b), (a, b, c)
a > 5 a = 5 and b > 6 a = 5 and b in (2, 3) and c > 5
b > 5 b = 6 and d = 7
a > 5 and b = 2 a = 5 and b > 6 and c = 2
若是組合索引中,seq_in_index爲N的列上,其查詢條件是開區間(如a>六、a<100等),則seq_in_index大於N的列上的索引失效。文檔
key_len:實際使用的索引的字節數字符串
SHOW STATUS LIKE 'Handler_read%';
Handler_read_key | 行被索引值讀取的次數 |
Handler_read_rnd_next | 讀取下一行的請求數 |
InnoDB 大量插入數據
SET UNIQUE_CHECKS = 0; SET AUTOCOMMIT = 0; -- LOADING DATA SET AUTOCOMMIT = 1; SET UNIQUE_CHECKS = 1;
導入數據按主鍵排列。
將多條INSERT合併:
INSERT INTO t VALUES (1, 2), (1, 3), ...
避免 GROUP 引起排序:
SELECT a, COUNT(*) FROM t GROUP BY a ORDER BY NULL;
讓 ORDER BY LIMIT 使用索引
KEY(A, B) -- 索引生效 ORDER BY A A = 5 ORDER BY B ORDER BY A DESC, B DESC A > 5 ORDER BY A -- 索引失效 ORDER BY B A > 5 ORDER BY B ORDER BY A ASC, B DESC
慎用 OFFSET
SELECT * FROM t LIMIT 10, 20; SELECT * FROM t LIMIT 20, OFFSET 10;
SHOW VARIABLES LIKE '%query_cache%'; SHOW STATUS LIKE 'Qcache%';