数据库设计优化

一、如何恰当选择引擎

  若是做cms系统,论坛,动态网页渲染,不需要强事务,可以用MyISAM引擎。
  有关电商、支付、金融这样的一些系统,需要强事务,就需要用Innodb(使用最多,默认引擎)。
  若需要在内存中临时建个表,要求速度快,数量小,不需要持久化,可以使用Memory引擎。
  数据需归档,那么我们可以使用默认的Achieve或者是Toku,Toku的压缩效率更高(一般是几十分之一)。

二、库表如何命名

  首先非常不建议使用拼音缩写来命名,要用有意义的词命名。
  库表应该划分的结构比较清楚,比如订单模块的表用Order作为前缀,用户模块的表用User作为前缀,用前缀表示不同的模块。若后期业务量增大后,不同模块的数据放到不同的库中,例:订单库,用户库。

三、如何合理拆分宽表

  在遵守数据库范式的前提下,将一个表拆分成主表,以及几个子表,把每个表的列数降低。

四、如何选择恰当的数据类型

  char、varchar的选择 char是定长的字符串类型,varchar是变长的字符串类型。若数据本身是变长的话,应当选varchar类型。
  (text/blob/clob)的使用问题 若存的是文本或一个临时的数据,数据量较大,这时我们就应该text/blob/clob这几种类型,一般不建议使用。若使用这些类型,性能一般也会下降几倍甚至是一个数量级。影响性能的原因: 会影响每个块能容纳的数据条数、记录数;像添加lob/clob这样的数据类型,一般是默认先把其他列的数据插入其中,把这个列先空出来,然后再单独把这列数据用update的方式打开一个流,再把流输进去,最后再走整个提交。
  文件、图片是否要存入到数据库中 可存入至分布式文件系统当中,在数据库字段中放入文件路径,或者是分布式文件系统中的URL又或是一个标识符。页面若再要调用图片,再把路径拼接出来返回给前端。
  时间日期的存储 date、datetime、timestramp、也可以使用long作为时间戳。可以通过应用服务器或数据库时间函数拿到时间。

五、唯一约束和索引关系

  唯一约束会自动建立索引。

六、是否可以冗余字段

  很多时候我们为了更高效的查询效率少去连一个表用来获取更多数据,我们可以在当前这个表里面主动的去冗余两三列数据。因为每次查主表的时候,子表里的这两三列经常会被用到。这样可以把这两三列冗余进来,不需要再不断地去关联子表,所以适当地冗余字段对查询数据也是非常有利的。

七、是否使用游标、变量、视图、自定义函数、存储过程

  首先不方便进行跨数据库移植
  其次用大量类似于自定义函数存储过程来实现业务逻辑的处理,没有用Java来处理复杂的业务逻辑来的方便。

八、自增主键的使用

  若数据量不大,建议使用自增主键作为唯一标识。若数据量较大,特别是分布式场景时,要对数据库进行拆分,分库分表,这时自增主键就不适用了。

九、能够在线修改表结构(DDL操作)

  尽量不要做,DDL操作会锁表,包括直接在线使用MySQL Dump操作,导出一个数据库所有表的数据也会直接把数据库所有表全锁上。默认情况下,尽量不要在线上干。应该选择在什么时间做呢?比如晚上业务系统几乎没啥压力,没什么应用,这时就可以做,更多的时候还是建议在我们系统停机维护的时候,比如停个15分钟,在这个时间窗口里再增加一个索引,修改一个字段。

十、逻辑删除还是物理删除

  建议最好还是逻辑删除,若是物理删除数据极有可能恢复不了,不利于后期做一些数据跟踪,数据审计。在大多数应用场景下,对数据做这种逻辑删除需要加一个标识位,标识它是删除的。

十一、要不要加create_time,update_time时间戳

  建议关键表都加上,这样数据的创建时间,修改时间都一清二楚。另一方面,当我们没有特别好的时候,做数据迁移的时候,这两个字段对数据迁移有很大的作用。

十二、数据库碎片问题

  当我们有不断的清理数据,删除数据,删除表操作,慢慢就会在表空间里产生了大量碎片。这样,我们可能需要定期的采用优化我们当前库/表的方式,去把MySQL的表空间的文件压缩一下,把中间的碎片压缩掉。不过这些操作容易锁表,最好在停机的时候进行操作。

十三、如何快速导入导出、备份数据

  导出数据的话,直接查出来,然后把它们存起来。数据库需要锁表,因为数据库里表之间都是关联的,一般建议停机时候做这个事。或者还可通过主从复制,binlog等方式。导入数据的话,可以用sql语句,或者用java程序进行插入数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值