这份文档由之前的一份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%';