`

不要放到数据库里三种东西

阅读更多
改进你的系统的最好的方法是先避免做“蠢事”。 我并不是说你或你开发的东西“蠢”,只是有些决定很容易被人们忽略掉其暗含的牵连, 认识不到这样做对系统维护尤其是系统升级带来多大的麻烦。

图片,文件,二进制数据

既然数据库支持BLOB类型的数据,把文件塞进BLOB字段里一定没有错了!?错,不是这样的! 别的先不提,在很多数据库语言里,处理大字段都不是很容易。

把文件存放在数据库里有很多问题:

对数据库的读/写的速度永远都赶不上文件系统处理的速度
数据库备份变的巨大,越来越耗时间
对文件的访问需要穿越你的应用层和数据库层
这后两个是真正的杀手。

把图片缩略图存到数据库里?很好,那你就不能使用nginx或其它类型的轻量级服务器来处理它们了。

给自己行个方便吧,在数据库里只简单的存放一个磁盘上你的文件的相对路径,或者使用S3或CDN之类的服务。

短生命期数据

使用情况统计数据,测量数据,GPS定位数据,session数据,任何只是短时间内对你有用,或经常变化的数据。 如果你发现自己正在使用定时任务从某个表里删除有效期只有一小时,一天或数周的数据, 那说明你没有找对正确的做事情的方法。 使用redis,statsd/graphite, Riak,它们都是干这种事情更合适的工具。 这建议也适用于对于收集那些短生命期的数据。

当然,用挖土机在后花园里种土豆也是可行的,但相比起从储物间里拿出一把铲子, 你预约一台挖土机、等它赶到你的园子里挖坑,这显然更慢。 你要选择合适的工具来处理手头上的事。

日志文件

把日志数据存放到数据库里,表面上看起来似乎不错,而且“将来也许我需要对这些数据进行复杂的查询”, 这样的话很得人心。这样做并不是一个特别差的做法, 但如果你把日志数据和你的产品数据存放到一个数据库里就非常不好了。

也许你的日志记录做的很保守,每次web请求只产生一条日志。 对于整个网站的每个事件来说,这仍然会产生大量的数据库插入操作, 争夺你用户需要的数据库资源。 如果你的日志级别设置为verbose或debug,那等着看你的数据库着火吧。

你应该使用一些比如Splunk Loggly或纯文本文件来存放你的日志数据。 这样去查看它们也许会不方便,但这样的时候不多,甚至有时候你需要写出一些代码来分析出你想要的答案, 但总的来说是值得的。
分享到:
评论

相关推荐

    三种东西永远不要放到mysql数据库里

    图片,文件,二进制数据永远不要放到mysql数据库里。很多人会觉得既然数据库支持BLOB类型的数据,把文件塞进BLOB字段里一定没有错了!?错,不是这样的! 别的先不提,在很多数据库语言里,处理大字段都不是很容易。...

    JSP+Servlet实现文件上传到服务器功能

    这里的User是由user表来定义的一个类,再封装增删改查等操作,实现从数据库查询与插入,修改与删除等操作,并实现了分页操作,也实现了将图片放到服务器上运行的效果。 Dao层:主要实现了User类的定义,接口IUserDao...

    Qt从数据库中提取数据给变量赋值

    Qt中执行sql语句,当需要变量存取从数据库中获取的值,首先取出一行数据,然后按列将数据分别赋给变量

    VB6.0 数据库开发完整实例

    运行程序前,先把Data下面的数据库放到位于SQL Server安装目录\MSSQL.1\MSSQL\Data下,然后在SQL Server里面的“数据库”上右键选中“附加”来添加目标数据库,最后在ODBC里注册一个NBooks的DSN就可以了。...

    dbt 把数据库结构提取到txt文件中

    配合版本控制软件,你就可以很容易了解到对数据库结构的所有变更。 方便大家在开发数据库时对数据库结构的控制,尤其是喜欢写存储过程的朋友们。 目前只支持oracle数据库,pro*c只能编译出指定版本的目标代码,所以...

    数据库 schema含义 .doc

    换句话说,如果他是某个仓库的主人,那么这个仓库的使用权和仓库中的所有东西都是他的(包括房间),他有完全的操作权,可以扔掉不用的东西从每个房间,也可以放置一些有用的东西到某一个房间,当然也可以拆除一个...

    基于java+springboot+springcloud开发的房产销售平台+源码+开发文档+源码解析+运行教程+数据库

    这个README里面不会放太多的东西,我会把构建这个项目的教程放到doc文件夹中。有大致的开发步骤,并且在代码中也会写上相应的注释和对应的文档标识,目的是为了让像我这样的比较笨的程序员能够知道怎么去完成这个项目

    数据库放到DB目录防止被下载插件 for z-blog

    还有就是,如果你的网站数据库里面有大量的会员,这些会员的资料也被外泄了,反正具有商业价值的东西都无一幸免,那么怎样防止自己的数据库被下载呢... ... 上网查一下,方法数不胜数。前辈们的高招的确很有用,...

    数据库存储过程调试工具

    Sybase_rar 几年前,在网上搜集资料的时候,突然搜到有关存储过程调试的一些api,名字叫dbgrpc,这个东西我估计很多人都不知道,我...今天把自己的这个程序也提供出来,放到网站给大家下载,希望为大伙带来一些方便吧。

    数据库工具类DatabaseUtil.java

    * 需要发送到数据库 SQL 语句 * @return a <code>ResultSet</code> object that contains the data produced * by the given query; never <code>null */ public ResultSet executeQuery(String sql) { try { ...

    jeecg 3.4.4 开源框架,已经删除多余的东西,拿来可用

    jeewx的目的是最大化的简化微信开发的流程,使用开发者能把最好的精力放到微信具体业务开发,并能以最快的时间完成。 把一些常规而频繁的工作交由jeewx来处理即可,平台兼备的代码生成器,在线开发,可以快速的完成...

    Sqldbx连接OracleX64位,前一个版本放少东西了

    标题“Sqldbx连接OracleX64位,前一个版本放少东西了”指出,用户在尝试使用Sqldbx连接到Oracle 64位数据库时遇到了问题,原因是前一个版本的安装或配置可能不完整。Sqldbx是一款开源的SQL查询工具,它支持多种...

    从零开始MySQL PDF资源

    一般我们必须要使用一个数据库连接池,也就是说在一个池子里维持多个数据库连接,让多个线程使用池子里的不同的数据库连接去执行SQL语句,然后执行完SQL语句之后,不要销毁这个数据库连接,而是把连接放回池子里,...

    丝路193服务端

    打开SQL 吧数据库 复制到服务端里 我习惯这么放 也可以换任意的位置 好了 还原完成 下面开始配置服务端 服务端我已经解压好了 把客户端的DATA解压到服务端 用工具共享里也有 别老问那些没有营养的问题 共享...

    tun2企业网站系统php

    其中tun2和tun2.sql是数据库文件,可以直接把tun2放到你的mysql服务器的data文件夹里,也可以把tun2.sql导进你的mysql数据库。 这是tun2的最开始的一个版本,当然 tun2现在又推出了新的版本叫什么cms3,但我之前...

    Java课程设计——购物车

    3. **Hibernate持久层框架**:Hibernate是一个对象关系映射(ORM)框架,它提供了一种在Java应用程序中操作数据库的方式,无需编写SQL语句。在购物车系统中,Hibernate用于管理商品、用户、订单等实体对象与数据库表...

    古韵孤风风格for dvbbs7.0sp2

    此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹为相关皮肤图片.(不要告诉我你不知道skins这个文件夹在那里吧) ●二...

    神话风格for dvbbs7.0sp2

    此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹为相关皮肤图片.(不要告诉我你不知道skins这个文件夹在那里吧) ●二...

    A3风格for dvbbs7.0sp2

    如果你要用动网默认的,就不要覆盖,如果要用,就覆盖啦,随便你了 此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹...

Global site tag (gtag.js) - Google Analytics