【发布时间】:2016-07-26 03:10:04
【问题描述】:
我为生物化学研究人员创建了一个网站,允许用户查询特定基因并计算不同基因组之间的各种统计数据。
MySQL DB 为 16GB,只读(我们的实验室生成了这个新颖的数据,网站是查看这些数据的门户)。我已经对该网站进行了性能测试,并意识到数据库查询是应用程序中最慢的部分。我想将整个数据库放入内存,但在普遍接受的解决方案中遇到了一些问题:
我有一个 8 核 32GB 的服务器供使用。
选项 1:设置 ENGINE = MEMORY
有几列是mediumtext 类型,超过了64k 行限制,拒绝放入MEMORY ENGINE
选项2:增加innodb_buffer_pool_size
这似乎并没有真正将数据放入内存。我使用所描述的技术(https://dba.stackexchange.com/questions/27328/how-large-should-be-mysql-innodb-buffer-pool-size)检查了使用的缓冲池,但只看到了大约 100Mbs 的使用缓冲池。 innodb_buffer_pool_size 正确设置为 24GB。
选项 3:创建一个 RAMdisk 并将 DB 放在那里 根据一些 SO 帖子,这似乎不是一个很好的选择。
我应该如何继续?请指教。
【问题讨论】:
-
如果每个查询都正常?使用所有查询一个最佳索引?你能多说一点关于每行表格的信息吗
-
缓冲区仅在使用数据库时随着时间的推移而被填充。你真的让它在不同的负载下运行了一段时间吗?
-
如果您不使用您使用的数据,缓冲池不会被填满。一旦你使用它,MySQL 就会从磁盘中读取它并将它添加到缓冲池 (RAM),所以下次你处理它时 - 它就在那里。您可以使用一个技巧来通过创建临时黑洞表并加载数据来预加载缓冲池:
CREATE TEMPORARY TABLE preload ENGINE = BLACKHOLE SELECT * FROM table_to_preload_into_buffer_pool。我不知道是否有任何配置选项可以让您在启动时预加载它,但这应该可以帮助您预加载缓冲池。