Mysgl优化
MySQL 优化是指对 MySQL 数据库的配置、表设计、查询语句等进行针对性的优化,以提高数据库的性能和效率。这包括但不限于合理设计数据库表结构、编写高效的 SQL 查询语句、创建合适的索引以及调整数据库服务器的参数等。
当MySQL单表记录数过大时,性能下降是一个常见问题。这是因为随着数据量的增加,数据库在执行增删改查操作时需要处理更多的数据。
当涉及到 MySQL 数据库优化时,可以从以下几个方面进行详细讨论:
一、单表优化:
-
字段优化:
- 选择合适的数据类型以减少存储空间和提高查询效率。
- 使用 TINYINT、SMALLINT、MEDIUM_INT 代替 INT,非负数加 UNSIGNED。
- VARCHAR 长度根据实际需要分配。
- 首选 TIMESTAMP 而非 DATETIME。
- 单表字段不超过 20 个。
- 尽量使用NOT NULL约束,避免NULL带来的额外开销。
- 枚举(ENUM)或整数(INT)比字符串(VARCHAR)更高效,特别是有大量重复值时。
- 使用整数存储IP地址以提高查询效率。
-
索引优化:
- 根据查询模式创建索引,重点关注WHERE和ORDER BY中的列,可根据EXPLAIN命令来查看是否用了索引还是全表扫描。
- 避免在 WHERE 子句中对字段进行 NULL 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
- 稀少值的字段不适合建索引,如性别。
- 避免使用外键和 UNIQUE 约束。
- 对字符字段可以考虑创建前缀索引以减少索引大小。
- 避免对索引列进行运算,以免引起索引失效。
-
查询SQL优化:
- 开启慢查询日志以定位性能瓶颈。
- 避免列运算,尽量简化 SQL。
- 不使用 SELECT *。
- 将 OR 改写成 IN。
- 避免函数和触发器,推迟至应用程序层实现。
- 少用 JOIN,使用同类型比较。
- 使用索引避免全表扫描,提高查询效率。
- 使用LIMIT进行分页查询,避免一次性获取大量数据。
- 尽量避免在WHERE子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
-
存储引擎选择:
- MyISAM适用于读多写少的场景,提供全文索引和压缩表功能。
- InnoDB适用于写多读少的场景,支持事务、行锁和外键,提供更高的并发处理能力和数据保护。
当然可以,以下是一个简单的表格,列出了MyISAM和InnoDB存储引擎的特点:
特点 | MyISAM | InnoDB |
---|---|---|
读写特性 | 读多写少 | 写多读少 |
事务支持 | 不支持 | 支持 |
锁定方式 | 表级锁定 | 行级锁定 |
外键支持 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
压缩表 | 支持 | 不支持 |
并发处理 | 较差 | 较好 |
数据保护 | 不提供数据保护机制 | 提供数据保护机制 |
总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表。
希望这个表格能够清晰地展示出MyISAM和InnoDB存储引擎的特点。
- 系统调优参数:
sysbench
:一个模块化,跨平台以及多线程的性能测试工具。
https://github.com/akopytov/sysbench
iibench-mysql
:基于Java的MySQL / Percona / MariaDB 索引进行插入性能测试工具。
https://github.com/tmcallaghan/iibench-mysql
tpcc-mysql
:Percona开发的TPC-C测试工具。
https://github.com/Percona-Lab/tpcc-mysql
在优化数据库时,建议定期监控性能并评估优化效果。在进行大规模优化前,应在测试环境中验证,确保安全有效。
二、读写分离:
通过将读操作和写操作分开到不