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

2017-12-29 10:27:51 +08:00
 Reign
服务器 i5 + 16G + 2T HDD + MySQL5.6,50 万行数据 30 个字段,4.3G 大小,随机取 50 个数据出来,总的耗时都在几毫秒之内,太快了吧,那么问题来了:

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

2.是不是没必要用 Redis 或者 memcache 之类做 cache 了,MySQL 都替我解决好了还是相对于 Redis 来说有哪些不足?
5510 次点击
所在节点    程序员
15 条回复
julyclyde
2017-12-29 10:49:26 +08:00
query cache
HowToMakeLove
2017-12-29 10:52:00 +08:00
随机是个怎么随机的?
你的随机是不是会走索引?
Reign
2017-12-29 10:56:59 +08:00
@HowToMakeLove 随机读取一些主键 ID 的一些字段
miniyao
2017-12-29 10:57:21 +08:00
会自动缓存查询数据,但是你无法自定义读取啊。mc redis 你可以在缓存里存、可以取。
R18
2017-12-29 11:01:35 +08:00
肯定是有缓存的,但不会是全部,我们 200G 的数据用了 7G 内存。具体缓存了啥我也不清楚.
Mysql 的缓存是不可控的(我的理解) Redis 可以指定缓存什么
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
2017-12-29 12:19:21 +08:00
redis 一般来解决大并发下数据库扛不住的问题吧。1000 个请求同时跑你这个逻辑可没准了。
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
2017-12-29 12:27:41 +08:00
@timchou
@monsterxx03 感谢,但是我的 MySQL 是 MyISAM 啊?
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
2017-12-29 12:37:59 +08:00
你要了解的这些《高性能 MySQL 》这本书有
timchou
2017-12-29 13:40:45 +08:00
@Reign 换引擎,mysql 现在默认都 innodb 了,myisam 有点弱。innodb 会强很多。
zhx1991
2017-12-29 13:51:44 +08:00


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

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

除非读的量真的很大, 可以考虑 redis
runntuu
2017-12-29 14:38:55 +08:00
1. MySQL 会将数据缓存在内存中,具体是缓存整张表还是缓存部分热数据,应该说都有。具体要看采用什么存储引擎,不用存储引擎有不同机制采用不同算法,但目的只有一个,尽快的返回客户端请求的数据。
理想情况当然是服务器内存大于数据文件大小,当数据文件太大时,就不得不依赖于上面说的机制了。
2. 有没有必要用 redis,当前不需要,现在 MySQL 的性能完全够用不是。但是未来需不需要,要看你们预估的数据规模和应用特点了。也不是什么都适合缓存在 redis 里,毕竟每个数据库有他的适用性不是?
3. 上面没有探讨技术细节,只是从宏观角度,希望你能回答你的问题。楼上有人推荐你《高性能 MySQL 》,我也推荐你去看看,看完之后对于数据库设计你会有新的认识。
4. 以上。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/418513

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX