Python-100-Days/Day91-100/93.MySQL性能优化.md

2.1 KiB
Raw Blame History

MySQL性能优化

使用索引

在前面《关系型数据库MySQL》一文中,我们已经讲到过索引的相关知识,这里我们做一个简单的回顾。

  1. B-Tree索引
  2. HASH索引
  3. R-Tree索引空间索引
  4. Full-text索引全文索引

使用过程

过程,通常也称之为存储过程。

create procedure ... (params)
begin
...
end;

call ...
cursor.callproc('...')

数据分区

SQL优化

  1. 通过show status了解各种SQL的执行频率。

    show status like 'com_%';
    show status like 'innodb_%';
    show status like 'connections';
    show status like 'slow_queries';
    
  2. 定位低效率的SQL语句 - 慢查询日志。

    show processlist
    
  3. 通过explain了解SQL的执行计划。

    • select_type查询类型simple、primary、union、subquery
    • table输出结果集的表
    • type访问类型ALL、index、range、ref、eq_ref、const、NULL
    • possible_keys查询时可能用到的索引
    • key实际使用的索引
    • key_len索引字段的长度
    • rows扫描的行数
    • extra额外信息
  4. 通过show profilesshow profile for query分析SQL。

  5. 优化CRUD操作。

    • 优化insert语句
    • 优化order by语句
    • 优化group by语句
    • 优化嵌套查询
    • 优化or条件
    • 优化分页查询
    • 使用SQL提示
      • USE INDEX
      • IGNORE INDEX
      • FORCE INDEX

配置优化

  1. 调整max_connections
  2. 调整back_log
  3. 调整table_open_cache
  4. 调整thread_cache_size
  5. 调整innodb_lock_wait_timeout

架构优化

  1. 通过拆分提高表的访问效率
    • 垂直拆分
    • 水平拆分
  2. 逆范式理论
    • 数据表设计的规范程度称之为范式Normal Form
      • 1NF列不能再拆分
      • 2NF所有的属性都依赖于主键
      • 3NF所有的属性都直接依赖于主键消除传递依赖
      • BCNF消除非平凡多值依赖
  3. 使用中间表提高统计查询速度
  4. 主从复制和读写分离
  5. 配置MySQL集群