MySQL数据层的优化总结
数据表数据类型优化
字段使用什么样的数据类型更合适,字段使用什么样的数据类型性能更快
- tinyint smalint bigint 考虑空间的问题,考虑范围的问题
- char varchar
- enum 特定、固定的分类可以使用enum存储,效率更快
索引优化
- 索引并不是越多越好,在合适的字段上创建合适的索引
- 复合索引的前缀原则
- like查询%的问题
- 全表扫描优化(例:在100条记录中查询98条记录,全表扫描比索引更快,那么会自动放弃索引)
- or条件索引使用情况(or前列有索引,后没有索引,会索引失效)
- 字符串类型索引失效的问题(数据库中存的是字符串,查询时没有加引号,则索引失效)
SQL语句的优化
优化查询过程中的数据访问
- 使用limit
- 返回列不用 *
优化长难句的查询语句
- 变复杂为简单
- 切分查询
- 分解关联查询
优化特定类型的查询语句
- 优化count()
- 优化关联查询
- 优化子查询,使用关联查询替代
- 优化 Group by 和distinct
- 优化limit 和 union
存储引擎的优化
尽量使用InnoDB存储引擎
数据表结构设计的优化
分区操作
- 通过特定的策略对数据表进行物理拆分
- 对用户透明
- partition by
分库分表
- 水平拆分(行)(例:活跃的与不活跃的)
- 垂直拆分 (列)(问题:常用列和不常用列都需要显示时,需要连接查询)
数据库服务器架构的优化
-
主从复制
-
读写分离
-
双主热备 1,2,3可以使用MySQL的binlog日志和中继日志,通过主库和从库的binglog的事件来回交换实现
-
负载均衡
- 通过LVS的三种基本模式实现负载均衡
- MyCat数据库中间件实现负载均衡(更简单,性能比 LVS 差)