首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:如果db没有任何MyISAM表,那么将`key_buffer_size`设置为0安全吗?

问MySQL:如果db没有任何MyISAM表,那么将`key_buffer_size`设置为0安全吗?
EN

Database Administration用户
提问于 2019-06-10 16:34:13
回答 2查看 5.7K关注 0票数 3

在我们的系统中,我们不使用MyISAM -只使用InnoDB (偶尔也使用内存)。

将key_buffer_size设置为0安全吗?或者有意想不到的副作用?根据手册,它似乎是安全的。

EN

回答 2

Database Administration用户

发布于 2019-06-10 16:54:55

在MySQL文档中,5.5、5.6、5.7和8.0的最小值为8。

如果在my.cnf中将其设置为0并重新启动mysqld,则可能会达到8。

由于钥匙_缓冲器_大小是动态的,所以登录到mysql并运行

代码语言:javascript
复制
mysql> SET GLOBAL key_buffeer_size = 0;
mysql> SELECT @@global.key_buffer_size;

不管它的价值是什么,那就去做吧。存储引擎层将处理它。

请注意,MyISAM仅缓存索引页。将默认的最小值设置为非常低的非零值8(确切地说是一个字节)可能更简单,而不是使用足够的RAM查看是否启用了密钥缓存的代码逻辑。

更新2019-06-10 13:16美国东部时间

代码语言:javascript
复制
root@vt-mysql:~# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.6.33-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select @@global.key_buffer_size;
+--------------------------+
| @@global.key_buffer_size |
+--------------------------+
|                 16777216 |
+--------------------------+
1 row in set (0.05 sec)

mysql> set global key_buffer_size = 0;
ERROR 1438 (HY000): Cannot drop default keycache
mysql> set global key_buffer_size = 8;
ERROR 1438 (HY000): Cannot drop default keycache
mysql> select version();
+-------------------------+
| version()               |
+-------------------------+
| 5.6.33-0ubuntu0.14.04.1 |
+-------------------------+
1 row in set (0.05 sec)

mysql>

文档是错误的:不能动态地调整全局缓冲区的大小。

我添加了key_buffer_size = 0并重新启动mysqld。它反弹到16M。

我添加了key_buffer_size = 8并重新启动mysqld。它反弹到16M。

代码语言:javascript
复制
root@vt-mysql:~# vi /etc/mysql/my.cnf
root@vt-mysql:~#
root@vt-mysql:~#
root@vt-mysql:~#
root@vt-mysql:~# grep key_buffer_size /etc/mysql/my.cnf
key_buffer_size = 0
root@vt-mysql:~# service mysql stop && sleep 10 && service mysql start
mysql stop/waiting
mysql start/running, process 1991
root@vt-mysql:~# mysql -ANe"SELECT @@global.key_buffer_size"
+----------+
| 16777216 |
+----------+
root@vt-mysql:~# vi /etc/mysql/my.cnf
root@vt-mysql:~# grep key_buffer_size /etc/mysql/my.cnf
key_buffer_size = 8
root@vt-mysql:~# service mysql stop && sleep 10 && service mysql start
mysql stop/waiting
mysql start/running, process 2112
root@vt-mysql:~# mysql -ANe"SELECT @@global.key_buffer_size"
+----------+
| 16777216 |
+----------+
root@vt-mysql:~# vi /etc/mysql/my.cnf
root@vt-mysql:~# grep key_buffer_size /etc/mysql/my.cnf
key_buffer_size = 2M
root@vt-mysql:~# service mysql stop && sleep 10 && service mysql start
mysql stop/waiting
mysql start/running, process 2234
root@vt-mysql:~# mysql -ANe"SELECT @@global.key_buffer_size"
+----------+
| 16777216 |
+----------+
root@vt-mysql:~#

我想我说的唯一正确的事情是:不管价值是什么,就随它去吧。存储引擎层将处理它。

票数 3
EN

Database Administration用户

发布于 2019-06-10 17:44:44

通过5.7,用户名和权限的表存储在MyISAM表中。因此,最好至少为它们的索引拥有少量的缓存。

1600万可能足以应付任何情况。

想想看-- 10米是你内存的多少百分比?小到微不足道,对吧?

8是没有意义的-- key_buffer是1KB索引块的集合。(正如Rolando所指出的,这会被归结为一些有用的东西。)

并不是每个设置都可以动态更改。8.0允许更改几乎所有的设置。与此同时,8.0几乎消除了MyISAM,因此key_buffer_size是一个毫无意义的问题。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/240210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档