## MySQL性能优化 ### 使用索引 在前面[《关系型数据库MySQL》](../Day36-40/36-38.关系型数据库MySQL.md)一文中,我们已经讲到过索引的相关知识,这里我们做一个简单的回顾。 1. B-Tree索引 2. HASH索引 3. R-Tree索引(空间索引) 4. Full-text索引(全文索引) ### 使用过程 过程,通常也称之为存储过程。 ```SQL create procedure ... (params) begin ... end; call ... ``` ```Python cursor.callproc('...') ``` ### 数据分区 ### SQL优化 1. 通过`show status`了解各种SQL的执行频率。 ```SQL show status like 'com_%'; show status like 'innodb_%'; show status like 'connections'; show status like 'slow_queries'; ``` 2. 定位低效率的SQL语句 - 慢查询日志。 ```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 profiles`和`show 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集群