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

MySQL 是否会将热数据缓存到内存中?

  •  
  •   Reign · 2017-12-29 10:27:51 +08:00 via iPhone · 5600 次点击
    这是一个创建于 2525 天前的主题,其中的信息可能已经有所发展或是发生改变。
    服务器 i5 + 16G + 2T HDD + MySQL5.6,50 万行数据 30 个字段,4.3G 大小,随机取 50 个数据出来,总的耗时都在几毫秒之内,太快了吧,那么问题来了:

    1.MySQL 是不是会将所有 table 都缓存到内存中还是只缓存频繁查询的热数据 table ?如果会把所有表都缓存到内存中的话,我是不是该把不必要的表删除一些来减少一点内存使用

    2.是不是没必要用 Redis 或者 memcache 之类做 cache 了,MySQL 都替我解决好了还是相对于 Redis 来说有哪些不足?
    15 条回复    2017-12-29 14:38:55 +08:00
    julyclyde
        1
    julyclyde  
       2017-12-29 10:49:26 +08:00
    query cache
    HowToMakeLove
        2
    HowToMakeLove  
       2017-12-29 10:52:00 +08:00
    随机是个怎么随机的?
    你的随机是不是会走索引?
    Reign
        3
    Reign  
    OP
       2017-12-29 10:56:59 +08:00 via iPhone
    @HowToMakeLove 随机读取一些主键 ID 的一些字段
    miniyao
        4
    miniyao  
       2017-12-29 10:57:21 +08:00
    会自动缓存查询数据,但是你无法自定义读取啊。mc redis 你可以在缓存里存、可以取。
    R18
        5
    R18  
       2017-12-29 11:01:35 +08:00
    肯定是有缓存的,但不会是全部,我们 200G 的数据用了 7G 内存。具体缓存了啥我也不清楚.
    Mysql 的缓存是不可控的(我的理解) Redis 可以指定缓存什么
    timchou
        6
    timchou  
       2017-12-29 11:40:10 +08:00
    肯定是会缓存的,但是机制很复杂,不是 lz 你说的那样

    主流的 Innodb 引擎,有个东西叫 innodb buffer pool,就是数据缓存池,一般专业网站的 mysql 配置,innodb buffer pool size 一般设置为主机内存的 70%多

    具体到你的问题
    1.不需要删。buffer pool 不是把 table 级别的数据缓存起来的,而且缓存底层的 block,block 是底层的数据结构。
    2.就你的场景而言,那确实不需要 redis 了
    RorschachZZZ
        7
    RorschachZZZ  
       2017-12-29 12:19:21 +08:00
    redis 一般来解决大并发下数据库扛不住的问题吧。1000 个请求同时跑你这个逻辑可没准了。
    monsterxx03
        8
    monsterxx03  
       2017-12-29 12:23:14 +08:00
    MySQL 主要有两种缓存,query cache 和 innodb buffer pool, query cache 现在的版本应该已经默认关闭了,以后会废弃.

    innodb buffer pool 是个类似 LRU 的内存 cache, 缓存的是 block, 你数据才 4.3 G, 合理设置 innodb_buffer_poolsize, 应该就够了. 自己不用也没法管理这个 cache. 以前写过点关于这个 buffer pool 的 http://blog.monsterxx03.com/2016/07/16/mysql-innodb-buffer-pool/
    Reign
        9
    Reign  
    OP
       2017-12-29 12:27:41 +08:00
    @timchou
    @monsterxx03 感谢,但是我的 MySQL 是 MyISAM 啊?
    monsterxx03
        10
    monsterxx03  
       2017-12-29 12:35:40 +08:00
    我又看了下,默认 query cache 还是开启的.

    T he query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0.

    你起作用的应该就是 query cache, 但这个挺坑的, 对应的 table 里只要有一条数据发生变动,整个 table 的 cache 都会失效,而且还有锁, 但如果你是读远大于写的场景还蛮有用的. 可以看下这篇: http://imysql.com/2014/09/05/mysql-faq-why-close-query-cache.shtml
    fuxkcsdn
        11
    fuxkcsdn  
       2017-12-29 12:37:59 +08:00 via iPhone
    你要了解的这些《高性能 MySQL 》这本书有
    timchou
        12
    timchou  
       2017-12-29 13:40:45 +08:00
    @Reign 换引擎,mysql 现在默认都 innodb 了,myisam 有点弱。innodb 会强很多。
    zhx1991
        13
    zhx1991  
       2017-12-29 13:51:44 +08:00


    比如给集群弄了一个新的从库, 不对数据进行预热直接访问大概率性能不行

    再有如果各种原因, 导致发生 swap 而引起命中率下降, 也会明显的发现性能下降
    zhx1991
        14
    zhx1991  
       2017-12-29 13:53:27 +08:00
    你这个数据, 就 50w 很小, 不要轻易上缓存, 因为这样要多余考虑一致性的问题, 增加复杂性

    除非读的量真的很大, 可以考虑 redis
    runntuu
        15
    runntuu  
       2017-12-29 14:38:55 +08:00 via iPhone
    1. MySQL 会将数据缓存在内存中,具体是缓存整张表还是缓存部分热数据,应该说都有。具体要看采用什么存储引擎,不用存储引擎有不同机制采用不同算法,但目的只有一个,尽快的返回客户端请求的数据。
    理想情况当然是服务器内存大于数据文件大小,当数据文件太大时,就不得不依赖于上面说的机制了。
    2. 有没有必要用 redis,当前不需要,现在 MySQL 的性能完全够用不是。但是未来需不需要,要看你们预估的数据规模和应用特点了。也不是什么都适合缓存在 redis 里,毕竟每个数据库有他的适用性不是?
    3. 上面没有探讨技术细节,只是从宏观角度,希望你能回答你的问题。楼上有人推荐你《高性能 MySQL 》,我也推荐你去看看,看完之后对于数据库设计你会有新的认识。
    4. 以上。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3510 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 00:44 · PVG 08:44 · LAX 16:44 · JFK 19:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.