V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kmvan
V2EX  ›  程序员

一个页面读 10 次硬盘 io 好,还是取 10 次 mysql 查询好?

  •  
  •   kmvan · 2014-12-31 16:27:11 +08:00 · 4608 次点击
    这是一个创建于 3611 天前的主题,其中的信息可能已经有所发展或是发生改变。
    
    如果服务器没有 memcache 之类的内存数据库,那么程序将缓存数据存为硬盘文件。

    在一个页面中,有 10 个模块,每个模块都需要读取一次 mysql 来查询数据。如果将各个模块缓存,没有 memcache 的情况下,将得到缓存数据为 10 个的硬盘文件,这样就减轻了 mysql 压力了。

    But,这样做真的可以吗?磁盘 io 比起 mysql 谁更容易跑死?
    24 条回复    2015-01-01 02:49:17 +08:00
    huigeer
        1
    huigeer  
       2014-12-31 16:31:35 +08:00
    mysql 的查询也是有缓存滴 一定要磁盘io, 建议ssd
    tczzjin
        2
    tczzjin  
       2014-12-31 16:33:27 +08:00
    如果你的磁盘io和mysql都是跑在一个服务器的话那就是走mysql好,如果是不同服务器的话...
    既然你都有>=2的服务器了,再配台服务器专门弄缓存才是王道
    66CCFF
        3
    66CCFF  
       2014-12-31 16:33:36 +08:00
    考虑ram cache?
    yanze0613
        4
    yanze0613  
       2014-12-31 16:35:27 +08:00
    同样的查询,mysql也有缓存,看具体查询了
    9hills
        5
    9hills  
       2014-12-31 16:35:39 +08:00
    你这个没法量化,比如MySQL查询是那种查询。10次IO又是多大的IO。。
    learnshare
        6
    learnshare  
       2014-12-31 16:39:46 +08:00
    MySQL 也是存取文件,不过还有数据的缓存。当然,直接读硬盘的文件也很快。But 你不做测试,没法直接断言
    wesley
        7
    wesley  
       2014-12-31 16:41:28 +08:00
    如果是小文件,磁盘读取也是有缓存的

    btw 可以用mysql的内存表
    lincanbin
        8
    lincanbin  
       2014-12-31 16:43:38 +08:00
    MySQL是有Cache的,近期的热数据会在内存的Cache里拿。
    如果你是说用文件作Cache的话,只有在数据库数据量特别巨大时,才有明显效果。
    typcn
        9
    typcn  
       2014-12-31 16:45:08 +08:00
    我都是直接存成程序的变量 简单暴力有效

    var xxx;
    if(!xxx){
    xxx = mysql查询;
    }
    GtDzx
        10
    GtDzx  
       2014-12-31 16:49:32 +08:00
    一般还是磁盘io更容易跑死吧
    akstrom
        11
    akstrom  
       2014-12-31 16:49:44 +08:00
    shtml
    66450146
        12
    66450146  
       2014-12-31 16:55:50 +08:00
    /dev/shm

    如果不用 ramdisk 的话妥妥的是 MySQL 啊
    zhicheng
        13
    zhicheng  
       2014-12-31 17:08:48 +08:00
    简单回答: MySQL
    这个和文件系统,文件尺寸,IO 性能,服务器内存大小都有很大关系。
    bjzhush
        14
    bjzhush  
       2014-12-31 17:13:46 +08:00
    你不知道innodb buffer pool嘛
    lhbc
        15
    lhbc  
       2014-12-31 17:17:38 +08:00
    Linux 系统,读过一次的文件在内存里,如果内存足够的话
    数据库如果查询比较复杂,耗费计算资源还是比较多
    lyragosa
        16
    lyragosa  
       2014-12-31 17:44:09 +08:00
    实践出真知

    我测试过 反复读100000次同一条sql文,和反复读硬盘上的一个文件,后者速度在我的机器上快很多。

    ssd,可能对其他应用不一定成立。所以自己测试才是王道。
    msg7086
        17
    msg7086  
       2014-12-31 17:49:43 +08:00 via iPhone
    说得好像读磁盘文件一定会访问磁盘一样
    zhicheng
        18
    zhicheng  
       2014-12-31 17:54:50 +08:00
    觉得读磁盘更快的同学,你们有没有考虑过一个问题,为什么大多数 Key/Value 数据库不是简单的把 Key 作为文件名 ,Value 作为内容按单个文件存储?
    yueyoum
        19
    yueyoum  
       2014-12-31 18:22:43 +08:00
    @zhicheng 为什么呢?
    MozzieCN
        20
    MozzieCN  
       2014-12-31 18:29:44 +08:00
    @yueyoum 因为文件是被缓存的,就算不会被缓存,按目前的文件系统来看,大文件基本上都是连续存储的.文件太小太多的话是随机存储,会增加磁头移动定位的时间.
    mqzhang
        21
    mqzhang  
       2014-12-31 19:33:27 +08:00 via Android
    推荐用leveldb或者ssdb,速度快,数据放硬盘,内存占用小
    kaneg
        22
    kaneg  
       2014-12-31 19:53:58 +08:00 via iPhone
    这要看你的sql查询耗时多少。举个极端的例子,每次查询耗时5秒,10次就得50秒,而如果只是从磁盘load一个结果,则要快得多,况且磁盘本身也有缓存
    gamexg
        23
    gamexg  
       2014-12-31 20:02:04 +08:00
    感觉缓存好些,最大的好处是性能有问题直接改改就能直接上 memcache 。
    msg7086
        24
    msg7086  
       2015-01-01 02:49:17 +08:00
    @zhicheng 因为会对Value的结构进行索引吧,比如NoSQL里存JSON/XML。
    纯KV查询很多就是直接用磁盘的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1158 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 23:06 · PVG 07:06 · LAX 15:06 · JFK 18:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.