三,数据库优化思路
1.SQL语句优化:
- 尽量避免放弃使用索引而引起全表扫描,例如:
- where子句中使用!=
- where子句中使用<>
- where子句中改变=号左边的值
- where子句中对字段进行null值判断 is null
select id from user where num is null
- 优化建议:
- 将为null的值由0代替
select id from user where num = 0
- 很多时候使用exists代替in是一个好的选择
- 用where子句替换having子句因为having只会在检索出所有记录之后才会对结果集进行过滤
- 将为null的值由0代替
2.索引优化
- 在具有这些性质的字段上建立索引:
- 经常搜索(可以加快搜索速度)
- 作为主键的列,强制该列的唯一性和组织表中的排序结构
- 在经常用于连接的列上(外键,可以加快连接速度)
- 在经常需要根据范围进行搜索的列上(索引以及排序,指定范围是连续的)
- 在经常需要排序的字段
- 在经常使用where的列上(加快条件的判断速度)
- 不应该建立索引列的特征:
- 查询中很少使用或者参考的列
- 数据值很少的列,例如:性别
- 类型定义为text,image和bit数据类型的列
- 修改远远大于检索的列
3.数据库结构优化
- 范式优化:
- 消除沉余(节省空间)
- 反范式优化:
- 适当加沉余(减少join)
- 拆分表:
- 分区将在物理硬盘上分割开,不同分区的数据可以制定保存在处于不同磁盘的数据文件里。当对这个表查询时,只需要在表分区中进行扫描,而不必进行全表扫描,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个良好的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时候可采用此方法。
- 例:1.产品表(数据量10万,稳定),2.订单表(数据量200万,且有增长趋势)3.用户表(数据量100万,且有增长趋势)
- 垂直拆分
- 方案:吧产品表和用户表放在一个server上订单表单独放到一个server上
- 解决问题:表于表之间的io竞争
- 不解决的问题:单表中数据量增加出现的压力
- 水平拆分
- 方案:用户表通过性别拆分男用户和女用户,订单表通过已完成订单和未完成订单拆分,将未完成数据单独放在一个server上,已完成订单和男用户放在一个server上
- 解决问题:单表中数据量增加出现的压力
- 不解决的问题:表与表之间的io争夺
4.服务器硬件的优化
- 花钱扩展服务器性能,搭建集群等等