数据库优化
关于数据库优化的问题我总结为已下七个方面去优化;不足之处请大家多指教。
- 根据服务器目前状况,修改mysql的系统参数,可达到合理利用服务器现有资源,最大合理的提高mysql性能。但一般我们从两个方向进行修改参数;一是mysql非缓存参数修改,二是mysql缓存变量修改。如何详细的修改请看我下一篇文章。
-
优化数据表结构:数据表设计遵循三范式
- 第一范式:数据库的每一列都是不可分割的原子数据项,而不能是集合、数组,记录非原子数据项。
- 第二范式:要求每一行的所有非主属性都必须完全依赖于主键;完全依赖:主键可能由多个属性构成,完全依赖要求不允许存在非主属性依赖于主键中的某一部分属性。
- 第三范式:实体中的属性不能是其他实体中的非主属性,即属性不依赖于其他非主属性。
- 字段类型
- 尽可能占用更少的存储空间
- 尽可能用整数代替字符串
- 尽可能定长的数据类型(占用固定的存储空间)
- 字段索引
- 表的主键、外健必须有索引
- 数据量大的表应该有索引
- 经常与其他表进行连接的表,在连接字段上应该上应该建立索引
- 经常出现在where子句中的字段,特别是大表的字段,应该建立索引
- 索引应该建立在选择性高的字段上
- 索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建索引
- 复合索引的建立需要进行仔细分析,尽量考虑用单字段索引代替
- 正确选择复合索引中的主列字段,一般是选择性较好的字段
- 复合索引的几个字段是否经常同时以AND方式出现在where子句中?单字段查询是否极少甚至没有,如果是,则可以建立复合索引;否则考虑单字段索引
- 如果复合索引中包含的字段经常单独出现在where子句中,则分解为多个单字段索引
- 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段
- 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引
- 分表,分库
- 分散存储压力(一般是没有其他优化的方案在考虑)
- 读写分离
- 读写分离通过主从备份数据,保证了系统的冗余,提高系统性能于数据库的负载能力。
- 优化SQL语句
- 框架自带的模型查询比原生的SQL要慢
- 应尽量避免在where子句中使用!=或者<>操作符,否则将引擎放弃使用索引进行全表扫描
- in 或者 not in 也需要慎重使用,否则会导致全表扫描
- 对于连续的数值能用between就不用in
- count优化
-
- sql子句中尽量不要进行函数或表达式操作
- 缓存极大的解决数据库服务器的压力
- 提高应用数据的响应速度
- 使用Statement对象
- 使用PreparedStatement对象
- 无论是Statement还是PreparedStatement,内部都含有一个list集合来保存一批多条sql语句。
- 数据库直接导出,拷贝文件到新服务器,在新服务上导入
- 使用第三方迁移工具
- 数据文件和库表结构文件直接拷贝到新服务器上,挂载到同样配置的mysql服务器下