数据库优化

1、创建索引

索引是对数据库表中一列或多列的值进行排序的一种结构,可以快速提高查询速度。

普通的搜索信息方式是全表搜索,是将所有记录取出,和查询条件进行逐一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;创建索引:索引把表中的逻辑值映射到安全的RowID,因此索引能进行快速定位数据的物理地址。查询时在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID快速找到表中对应的记录。

创建索引后insert、update速度会变慢;如果没有特殊的要求,建议只创建主键一个索引,update时根据主键去更新。

优点:

  1. 大大加快数据的检索速度;
  2. 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间;
  3. 创建唯一性索引,保证数据库表中每一行数据的唯一性;

缺点:

  1. 索引需要占物理空间,如果要建立聚簇索引,那么需要的空间就会更大;
  2. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度;
  3. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;
  4. 创建索引后insert、update速度会变慢;

2、分表

面对海量数据的表的时候,我们需要对它进行分表处理。分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表。可以根据时间和不同的字段以及类型来分表。选择分表的依据是很关键的,所以要根据自己数据特点来分表。

例如:利用merge存储引擎分表(分表的一种):主表和子表,主表类似于一个壳子,逻辑上封装了子表,实际上数据都是存储在子表中的。

3、分区

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。读写的时候操作的还是大表名字,db自动去组织分区的数据。

MySQL有一个很大的问题:数据清理很烦。目前的版本可以支持一个表里面可以按ID或者按date等等去做一些分区,然后这个数据不要了,就drop掉一个分区就可以了。相对来说drop掉一个分区是比较轻量的操作,会比较快,数据的清理会非常方便。

分表和分区的区别:

  1. 分表后,数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面;分区只不过把存放数据的文件分成了许多小块,分区后的表呢,还是一张表。数据处理还是由自己来完成。
  2. 分表技术是比较麻烦的,需要手动去创建子表,服务端读写时候需要计算子表名;表分区操作方便,不需要创建子表。

4、SQL优化

  1. select中避免使用“*”,尽量指出具体的字段;
  2. 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描;如:“select name from table where num+2 = 6” 可以改为:“select name from table where num = 6-2”
  3. 如果只修改某几个字段,尽量不要update全部字段;
  4. 不允许字段为空,而用一个缺省值代替空值,判断字段是否为空一般是不会应用索引的,因为B树索引是不索引空值;

  5. 判断真假时,如果带and 或 or:如“where 条件1 and 条件2 ”,数据库限制性右边的语句,尽量把假的放到and右边,对于or则是把真的放到右边;
  6. 对于数据量比较大的,尽量使用分页查询;
  7. 只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了;

5、使用别名

表名、列名在查询中以一个字母为别名,查询速度要比建连接表快1.5倍。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值