MySQL优化方法

MySQL优化方法

说明

这份文档由之前的一份PPT修改而成。其内容可能不适用最新版本的MySQL数据库。数据库

原则

  1. 80/20 法则
  2. 避免没必要要的操做
  3. 时空权衡

常见MySQL操做

SELECT+UPDATE 80
INSERT+DELETE 20

 

SELECT 80
UPDATE 20

SELECT 读锁
UPDATE 写锁

 

MyISAM 表锁,冲突几率高,并发低
InnoDB 行锁,冲突几率低,并发高
  • 若是SELECT和UPDATE比较平均,InnoDB性能更好。
  • InnoDB在不使用索引时也会锁表。
  • 大量使用SELECT COUNT(*)的表不宜采用InnoDB。

查找记录

  • SELECT * FROM tbl WHERE col1=’xxx’;
  • 全表扫描
  • 表 -> 关系(集合)
  • 行 -> 元素(向量)

Profiling

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:实际使用的索引的字节数字符串

索引失效缘由

  1. 不是组合索引的最左前缀。
  2. LIKE 以 ‘%’ 开头。
  3. WHERE col1=123 中,列 col1 是CHAR/VARCHAR/TEXT类型。
  4. ORDER BY 子句混合使用ASC/DESC。
  5. ORDER BY 使用的列和WHERE列不一样。
  6. 对不一样的键使用 ORDER BY。
  7. 错误的使用组合索引。
  8. OFFEST 过大。

索引设计原则

  1. 出如今 WHERE 子句和 JOIN 子句中的列要考虑增长索引。MySQL 实现 JOIN 时会执行内部循环。
  2. 列的值越分散,用做索引时的效率越高。
  3. 字符串使用前缀作索引。
  4. 避免过分索引。

查看索引使用状况

SHOW STATUS LIKE 'Handler_read%';

 

Handler_read_key 行被索引值读取的次数
Handler_read_rnd_next 读取下一行的请求数

SQL语句优化

  1. InnoDB 大量插入数据

    SET UNIQUE_CHECKS = 0;
    SET AUTOCOMMIT = 0;
    -- LOADING DATA
    SET AUTOCOMMIT = 1;
    SET UNIQUE_CHECKS = 1;
  2. 导入数据按主键排列。

  3. 将多条INSERT合并:

    INSERT INTO t VALUES (1, 2), (1, 3), ...
  4. 避免 GROUP 引起排序:

    SELECT a, COUNT(*) FROM t GROUP BY a ORDER BY NULL;
  5. 让 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
  6. 慎用 OFFSET

    SELECT * FROM t LIMIT 10, 20;
    SELECT * FROM t LIMIT 20, OFFSET 10;

Query Cache

SHOW VARIABLES LIKE '%query_cache%';
SHOW STATUS LIKE 'Qcache%';

修订记录

  1. 2017年06月19日 根据之前的PPT改写。
相关文章
相关标签/搜索