图片 12

mysql 开发进阶篇系列 16 MySQL Server(myisam key_buffer)

Posted by

一.概述

         mysql
提供了很多参数来进行服务器的设置,当服务第一次启动的时候,所有启动参数值都是系统默认的。这些参数在很多生产环境下并不能满足实际的应用需求。在这个系列中涉及到了liunx
服务器,我这里是centos7.4, mysql 5.7,Xshell6。

  1. 查看mysql server参数

         通过show variables和show
status命令查看mysql的服务器静态参数值和动态运行状态信息。前者是在数据库启动后不会动态更改的值。比如缓冲区大小,字符集,数据文件名称等;
后者是数据库运行期间的动态变化的信息,比如锁等待,当前连接数等。下面来简单查看下两个命令

--  mysql服务静态参数值
SHOW VARIABLES;

图片 1

--  mysql服务运行状态值
SHOW STATUS;

图片 2

5.Innodb_additional_mem_pool_size

这个参数用来存在数据库结构和其他内部数据结果的内存池的大小。

二.  影响mysql性能的重要参数

  在上面介绍了mysql server 端的参数查看方法 ,对于这么多参数,
实际大多数参数是不需要用户调整的,下面介绍一些重要参数。先介绍下MyISAM存储引擎的key_buffer_size和table_cache。

  1. key_buffer_size设置

                   key_buffer_size是用来设置索引块(index
Blocks)缓存的大小,它被所有线程共享,此参数只应于MYISAM存储引擎。在mysql
5.1后,系统除了默认的索引块缓存,还可以配置多个key_buffer,可以将指定的表索引,缓存入指定的key_buffer,这样可以更小地降低线程之间的竞争。

-- 查看默认设置
 SHOW VARIABLES LIKE 'key_buffer_size';  

    8388608/1024.0/1024.0=M  默认8M 如下图所示:

     图片 3

-- 建立一个新的索引块缓存
SET  GLOBAL hot_cache2.key_buffer_size=128*1024

  对于GLOBAL
表示对每一个新的连接,此参数都将生效,hot_cache2是新的key_buffer名称,可以随时进行重建,例如:

SET  GLOBAL hot_cache2.key_buffer_size=200*1024

  把相关表的索引,放到指定的索引块缓存中如下:

-- 将表(userbymyisam )索引放入指定的索引块中 
CACHE INDEX userbymyisam IN hot_cache2

图片 4

  想将索引预装到默认的key_buffer中,可以使用load index into
cache语句,例如预装表userbymyisam的所有索引 预装到默认的key_buffer。

LOAD INDEX INTO CACHE userbymyisam

图片 5

-- 删除索引缓存,如下命令
SET  GLOBAL hot_cache2.key_buffer_size=0

  注意:默认的key_buffer是不能删除的如:  SET  GLOBAL
key_buffer_size=0 下次重启时还会有。

 总结: cache
index命令在一个表和key_buffer之间建立一种联系,但每次服务器重启时key_buffer中的数据将清空,如果想每次服务器重启时相应表的索引能自动放到key_buffer中,可以在配置文件中设置init-file选项来指定包含cache
index语句文件路径,然后在对应的文件中写入cache index语句。

   下面创建二个缓存索引块:

图片 6

  每次服务器启动时,执行mysqld_init.sql中的语句,
文件中几个表,分别对应hot_cache和cold_cache:
图片 7

  2. 通过操作系统来设置key_buffer

    如果要设置mysql服务系统参数可以在liunx里设置,先要找到my.cnf
文件位置,一般会放在/etc/my.cnf,/etc/mysql/my.cnf。
    如下图所示,尝试修改默认key_buffer_size改为12M:
    图片 8
    图片 9
    停止服务再重启sql服务
    图片 10
    图片 11
    再次查询如下

    图片 12

将索引放到默认的kef_buffer中

可以使用load index into cache +表名

索引缓存概述

MyISAM存储引擎和其他很多数据库系统一样,采用了一种将最经常访问的表保存在内存中的策略。对应索引区块来说,它维护者一个叫做索引缓存(索引缓冲)的结构体,这个结构体中存放着许多哪些经常使用的索引区块的缓冲区块。对应数据区块来说,Mysql主要依靠系统的本地文件系统缓存。有了索引缓冲后,线程之间不再是串行地访问索引缓存。多个线程可以并行地访问索引缓存。可以设置多个索引缓存,同时也能指定数据表索引到特定的缓存中。

 

7.innodb_log_file_size

日志组中每个日志文件的大小

3.Innodb_buffer_pool_size

这个参数定义了InnoDB存储引擎的表数据和索引数据的最大内存缓存区大小。和MyISAM存储引擎不同,MyISAM的key_buffer_size只缓存索引键,而Innodb_buffer_pool_size同时为数据块和索引块做了缓存,这个只设的越高,访问表中的数据需要的磁盘I/O就越少。但是设置的过大,会导致物理内存竞争过大。

删除索引缓存

将其索引缓冲大小设置为了0,就可以删除了,注意不能删除默认的key_buffer。

创建一个索引缓存

set global 缓存索引名.key_buffer_size=100*1024;
图片 13
global是全局限制,表示对每一个新的会话(连接)都有效。

参数调优

通过检查mysqld的状态变量open_tables和opend_tables确定table_cache这个参数的大小。open_tables代表当前打开的表缓冲数量,如果执行flush
tables,则系统会关闭一些当前没有使用的表缓存,使得open_tables值减少。opend_tables表示曾经打开的表缓存数,会一直进行累加,不会因为执行flush
tables操作,有所减少。如下图,变化还是很明显的。
图片 14
当执行一个查询之后,发现opend_table和open_table都增加了1
图片 15
当再次执行同一个查询之后,发现opend_table和open_table都不再变化
图片 16
由此可见open_table对于设置table_cache更有价值

2.table_cache

将相关表的索引放到自己创建的索引缓存中

格式:cache index 表名1,表名2 in
索引缓存将t1、t2、t3表中的索引放到my_cache索引缓存中
图片 17

因为t1表式InnoDB表,t2,t3表为MyISAM表,故只有t2、t3表中的索引可以放到my_cache缓存中。

相关文章

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注