数据库优化

关于数据库优化的问题我总结为已下七个方面去优化;不足之处请大家多指教。

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