mysql 以空间换时间专研

提高mysql数据库执行效率是个永远的难题,在数据量增加到必定量后,都会有各类解决方案,好比分库分表,加大服务器内存、cpu。而这里我要探讨在没有大的改动下,对大部分中小平台适用,如何快速提升数据库执行效率。html

1、增长空间换时间mysql

数据表
CREATE TABLE `sms` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `user_id` bigint(20) NOT NULL COMMENT '用户id',
  `tel` char(11) NOT NULL COMMENT '用户手机号',
  `content` text NOT NULL COMMENT '短信详情',
  `create_time` datetime NOT NULL COMMENT '建立时间',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `send_status` tinyint(1) unsigned DEFAULT '1' COMMENT '发送状态1,未发送2,发送中3,已发送4,失败',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='短信发送队列'

 

一、增长多余字段redis

这种数据库反范式的设计,用空间来换取时间,把数据冗余在多个表中,当查询时能够减小或者是避免表之间的关联。以发送短信的表为例,用户手机号是和用户user_id关联的,用户表是自带tel字段,这里在sms表增长tel字段,减小联表查询。增长字段经常使用的场景有:用户帐号,用户昵称,订单中的商品名称,商品规格、价格等。其实增长字段能够有效的保护数据安全和校验。好比支付表的金额和订单的金额,数据都须要双存储,支付表的金额和订单中的金额一致。sql

二、使用索引数据库

索引是最典型的以空间换效率的手段,仍是以sms表为例,tel和user_id能够添加索引。索引的话题比较大,这里不作说明。缓存

三、增长表安全

须要查询的字段单独放入另一张表,好比搜索条件。常见的搜索商品业务,商品的发货地(此数据通常关联商家地址)、重量、规格、是否无条件退款(关联商家)等,这些搜索条件单独存一张表。还有常见的统计业务,不该实时查询,增长一张表,定时查询统计后插入到新表中。服务器

四、视图运维

数据表视图也是经常使用的办法,不过咱们实践过程当中发现并非特别好,维护数据表比较麻烦。不推荐,特殊状况也能够用。nosql

五、缓存空间

程序缓存,好比文件缓存,还有各类nosql,memcahce、redis这样的Key-Value数据库,本质上也是空间换时间,或者说换个好点的空间。

2、减小空间换时间

一、删除数据

发短信这个业务,能够理解为,发送完短信,这条记录就不须要了,因此就能够把数据删除掉,

有限减小这张表的数据总量。相似这样的业务:推送消息、操做日志(不重要的日志)

二、备份数据

删除数据是不靠谱的手段,数据库里面的数据都是有用的。有一条规则,加字段标记为删除,也不要物理删除数据,这是不少开发人员常见的错误,好比产品经理要求开发个删除功能,开发就把数据删除了。准确的作法是每隔一段时间,就把sms表里面的数据所有备份到另一张表,备份好后,再把sms的数据删除掉,两条sql语句能够搞定。

下次备份的时候更换id取值范围。

固然,操做前先备份,以备误操做。

常见的业务:用户的浏览行为、错误日志、发送的邮件等。

总结

抛出来了一些业务场景,结合本身的业务有效的提高MySQL性能,上面的规则也不是永远有效,还要考虑到运维部署,开发改动等,在实践中再改进。

原文连接:https://www.ffeeii.com/543.html