一、表结构设计优化

  • 数据库引擎的选择 默认的是InnoDB,还有MySIAM
  • 字符集的统一,统一使用utf8
  • 创建索引 1、一个表中不建议超过五个索引,可以选择使用复合索引,索引中的字段数同样不建议超过五个。 2、避免在索引上使用函数,会造成索引失效
  • 选取字段属性 MySql可以很好的支持大数据量的存储,但是一般来说,数据库表越小,查询的效率越快,因此在创建表的时候,为了获得更好的性能,我们需要将表的字段设置的尽可能的小。 例如:邮编号码,直接将其设置为char(6)即可,无需使用char(255),或者varchar增加没有必要的空间(char和varchar的区别) 例如:尽量将字段设置为not null,这样查询过程中,数据库就不用去比较null值。提高查询效率 例如:对于某些大量重复的文本字段“省份”“性别”,可以将其定义为ENUM类型。

二、方案设计优化

  • 业务拆分 流水行数据:无状态的,多笔业务之间没有关联性的,比如消息处理log表。 写多读少 状态型数据:有状态的,多笔业务之间存在关联性的,比如保单处理轨迹表。频繁读写 配置型数据:数据量较小,一般为静态表,变化频率低。读多写少。 根据对客业务类型,进行拆分:将混合业务拆成独立业务。例如:按照短险,长险,第三方渠道险种进行拆分。  
  • 数据库分库,分表,分区  详解  
  • 数据库框架扩展  
  • 主从复制与读写分离 再生产环境中,数据库大多都是读操作,,所以部署一主多从架构,主数据库负责写操作,并做双击热备,多台从数据库做负载均衡,负责读操作。  
  • 增加缓存 给数据库增加缓存系统,把热数据缓存到内存中,如果内存中可以得到数据就不会再去数据库中读取,提到读的性能。缓存分为 本地缓存和分布式缓存 : 本地缓存是将数据缓存到本地服务器内存或者文件中;分布式缓存,可以缓存海量数据,扩展性好,主流的分布式缓存系统memcached、redis等。

三、SQL语句优化

1、避免放弃使用索引而进行全表扫描的情况

在where后的条件中尽量不使用 :

  • 不等的判断  !=,<>
  • 不对null进行判断
  • 不在like后用前置 %
  • 不在条件语句中使用函数或则表达式

2、正确的使用索引

  • 尽量在order by 和 where 语句后面使用索引列;注意:mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列就不会再使用索引了,因此数据库默认默认排序可以满足的时候就不要再使用排序功能,尽量不要包含多列的排序,如果必须进行多列排序,可以考虑建立复合索引
  • 尽量使用索引列进行范围查询;

3、正确选择exist 与 in ,和 not exist 与 not in

       在任何情况下 not exist 的效率都高于 not in

  • exist 的工作原理,他是先获取外表的值,然后带入子集中获取可以匹配的数据。适用于子集比较大的情况 大于1000
  • in 的工作原理,是先获取子查询的结果集然后与外表做了一个笛卡尔积 适用于 子集比较小的查询 小于1000

4、使用join来替代子查询

子查询:通过select语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。如果可以使用join来代替子查询,效率会快很多。

5、使用联合(UNION)来代替手动创建的临时表

6、通过explain来分析sql的执行情况

参考文章-1参考文章-2