Three things you should never put in your database
As I've said in a few talks, the best way to improve your systems is by first not doing "dumb things". I don't mean you or your development staff is "dumb", it's easy to overlook the implications of these types of decisions and not realize how bad they are for maintainability let alone scaling. As a consultant I see this stuff all of the time and I have yet to ever see it work out well for anyone.
Images, files, and binary data
Your database supports BLOBs so it must be a good idea to shove your files in there right? No it isn't! Hell it isn't even very convenient to use with many DB language bindings.
There are a few of problems with storing files in your database:
•read/write to a DB is always slower than a filesystem
•your DB backups grow to be huge and more time consuming
•access to the files now requires going through your app and DB layers
The last two are the real killers. Storing your thumbnail images in your database? Great now you can't use nginx or another lightweight web server to serve them up.
Do yourself a favor and store a simple relative path to your files on disk in the database or use something like S3 or any CDN instead.
Ephemeral data
Usage statistics, metrics, GPS locations, session data anything that is only useful to you for a short period of time or frequently changes. If you find yourself DELETEing an hour, day, or weeks worth of some table with a cron job, you're using the wrong tool for the job.
Use redis, statsd/graphite, Riak anything else that is better suited to that type of work load. The same advice goes for aggregations of ephemeral data that doesn't live for very long.
Sure it's possible to use a backhoe to plant some tomatoes in the garden, but it's far faster to grab the shovel in the garage than schedule time with a backhoe and have it arrive at your place and dig. Use the right tool(s) for the job at hand.
Logs
This one seems ok on the surface and the "I might need to use a complex query on them at some point in the future" argument seems to win people over. Storing your logs in a database isn't a HORRIBLE idea, but storing them in the same database as your other production data is.
Maybe you're conservative with your logging and only emit one log line per web request normally. That is still generating a log INSERT for every action on your site that is competing for resources that your users could be using. Turn up your logging to a verbose or debug level and watch your production database catch on fire!
Instead use something like Splunk, Loggly or plain old rotating flat files for your logs. The few times you need to inspect them in odd ways, even to the point of having to write a bit of code to find your answers, is easily outweighed by the constant resources it puts on your system.
But wait, you're a unique snowflake and your problem is SO different that it's ok for you to do one of these three. No you aren't and no it really isn't. Trust me.
导读:作者Frank Wiles发表了一篇博文,Frank Wiles曾在很多演讲里说过,改进你的系统的最好的方法是先避免做“蠢事”。并不是说你或你开发的东西“蠢”,只是有些决定很容易被人们忽略掉其暗含的牵连,认识不到这样做对系统维护尤其是系统升级带来多大的麻烦。作为一个顾问,像这样的事情我到处都能见到,我还从来没有见过做出这样的决定的人有过好的结果的。
图片,文件,二进制数据
既然数据库支持BLOB类型的数据,把文件塞进BLOB字段里一定没有错了!?错,不是这样的!别的先不提,在很多数据库语言里,处理大字段都不是很容易。
把文件存放在数据库里有很多问题:
•对数据库的读/写的速度永远都赶不上文件系统处理的速度
•数据库备份变的巨大,越来越耗时间
•对文件的访问需要穿越你的应用层和数据库层
这后两个是真正的杀手。把图片缩略图存到数据库里?很好,那你就不能使用nginx或其它类型的轻量级服务器来处理它们了。
给自己行个方便吧,在数据库里只简单的存放一个磁盘上你的文件的相对路径,或者使用S3或CDN之类的服务。
短生命期数据
使用情况统计数据,测量数据,GPS定位数据,session数据,任何只是短时间内对你有用,或经常变化的数据。如果你发现自己正在使用定时任务从某个表里删除有效期只有一小时,一天或数周的数据,那说明你没有找对正确的做事情的方法。使用redis, statsd/graphite, Riak,它们都是干这种事情更合适的工具。这建议也适用于对于收集那些短生命期的数据。
当然,用挖土机在后花园里种土豆也是可行的,但相比起从储物间里拿出一把铲子,你预约一台挖土机、等它赶到你的园子里挖坑,这显然更慢。你要选择合适的工具来处理手头上的事。
日志文件
把日志数据存放到数据库里,表面上看起来似乎不错,而且“将来也许我需要对这些数据进行复杂的查询”,这样的话很得人心。这样做并不是一个特别差的做法,但如果你把日志数据和你的产品数据存放到一个数据库里就非常不好了。
也许你的日志记录做的很保守,每次web请求只产生一条日志。对于整个网站的每个事件来说,这仍然会产生大量的数据库插入操作,争夺你用户需要的数据库资源。如果你的日志级别设置为verbose或debug,那等着看你的数据库着火吧。
你应该使用一些比如Splunk Loggly或纯文本文件来存放你的日志数据。这样去查看它们也许会不方便,但这样的时候不多,甚至有时候你需要写出一些代码来分析出你想要的答案,但总的来说是值得的。
可是稍等一下,你是那片不一样的雪花,你遇到的问题会如此的不同,所以,如果你把上面提到的三种东西中的某一种放到了数据库里也不会有问题。不,你错了,不,你不特殊。相信我。
译文出自:外刊IT评论
英文出自:revsys
分享到:
相关推荐
图片,文件,二进制数据永远不要放到mysql数据库里。很多人会觉得既然数据库支持BLOB类型的数据,把文件塞进BLOB字段里一定没有错了!?错,不是这样的! 别的先不提,在很多数据库语言里,处理大字段都不是很容易。...
如果你要用动网默认的,就不要覆盖,如果要用,就覆盖啦,随便你了 此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹...
此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹为相关皮肤图片.(不要告诉我你不知道skins这个文件夹在那里吧) ●二...
此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹为相关皮肤图片.(不要告诉我你不知道skins这个文件夹在那里吧) ●二...
如果你要用动网默认的,就不要覆盖,如果要用,就覆盖啦,随便你了 此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹...
如果你要用动网默认的,就不要覆盖,如果要用,就覆盖啦,随便你了 此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹...
如果你要用动网默认的,就不要覆盖,如果要用,就覆盖啦,随便你了 此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹...
如果你要用动网默认的,就不要覆盖,如果要用,就覆盖啦,随便你了 此皮肤只适用DVBBS7.0 SP2 ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库.其它文件夹...
放入xp(2000)的光盘,安装时候选R,修复! Windows XP(包括 Windows 2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。小编的确一直都想把这方面的命令做个总结...
不要随意删除文件里的东西,或更改文件位置。 个人开发,没有安全机制申请。所以如果发现缺少爬虫和银行管理系统这两个软件,查询电脑是否开启了杀毒软件如电脑管家拦截了这两个文件。 用open等函数创建了一个账户...
其中使用sqlite的那个系统将文件(可能还有其他的什么东西)放到了一个单独的数据库文件中,是值得借鉴的。 2、CINtanotes的实现可以汲取的地方 这个样式是我一直想实现但是实现不了的。但是确实很重要,可能还是要...
老鸟就不要看了,会觉得烦的) ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库....
老鸟就不要看了,会觉得烦的) ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库....
其实,这两个东西至少我暂时是不大想放出来的,只是觉得反正这里也不更新了,仅仅将这些东西作为礼物吧,再说毕竟这些东西太过于菜菜了。还是先来介绍下最后的两个礼物吧: 校园多媒体系统: 这个大概是今年过年后...
老鸟就不要看了,会觉得烦的) ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库....
老鸟就不要看了,会觉得烦的) ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库....
老鸟就不要看了,会觉得烦的) ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※ ●一、先把压缩包里的所有东西解压之后全部放入skins文件夹内,Dv_skin.mdb为皮肤数据库....
4、算法上的问题,不应该把大的数据,比如文件和 Blob/Clob 之类的东西读入到内存进行处理,而应该用 Stream 的方式进行。 在处理大数据时,应该使用 Stream 的方式,而不是把数据读入到内存中,以免内存溢出。 5...
整体结构和一些主要职责(如数据库操作 事务跟踪 安全等),剩余的就是变化的东西,针对这个领域中具体应用产生的具体不同 的变化需求,而这些变化东西就是 J2EE 程序员所要做的。 由此可见,设计模式和 J2EE 在思想...