首页 > 代码库 > Mysql内存表配置及性能测试
Mysql内存表配置及性能测试
centos7 mysql数据库安装和配可以参考一下文章,基本照做就可以了(我选的方法二):
http://www.cnblogs.com/starof/p/4680083.html
说到内存表,首先有两个概念简单区分下:
1.临时表;2.内存表;
临时表与内存表的区分:
临时表是指使用create temprary
table创建的临时表.临时表可以使用任何存储引擎,临时表只在单个连接中可见,当连接断开时,临时表也会消失.
MySQL最初会将临时表创建在内存中,当数据变的太大后,就会转储到磁盘上.
内存表是指用memory引擎创建的表.表结构存在于磁盘,数据放在内存中.
临时表创建的条件:
1,查询中有排序(ORDER BY)和分组(GROUP BY)的操作
2,在排序中使用过滤重复列(DISTINCT)
3,查询中用SQL_SMALL_RESULT选项
遇到下列情况会将内存中的临时表写入磁盘:
1,表中存在BLOB和TEXT字段
2,分组或过滤的列超过512字节
3,查询中合并结果集的列超过512字节
如果起初在内存中创建的临时表变的太大,MySQL会自动将其转成磁盘上的临时表.
内存中的临时表由 tmp_table_size 和 max_heap_table_size 两个参数决定.这与创建MEMORY引擎的表不同.MEMORY引擎的表由max_heap_table_size参数决定表的大小,并且它不会转成到在磁盘上的格式.
当MySQL创建临时表时(包括内存上和磁盘上),都会增加Created_tmp_tables
状态值,如果MySQL在磁盘上创建临时表(包括从内存上转成磁盘的),都会增加 Created_tmp_disk_tables状态值.
****关于内存表和临时表的两个选项****
# 独立的内存表所允许的最大容量.
# 此选项为了防止意外创建一个超大的内存表导致用尽所有的内存资源.
# 设置范围16KB-4GB
max_heap_table_size = 64M
# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.
# 此限制是针对单个表的,而不是总和.
tmp_table_size = 64M
下面具体说下内存表,首先创建表是跟普通建表类似,只是engine=MEMORY(5.5之后是用engine,之前是type,同时heap就是memory,最好使用memory)可创建。
对于我们常用的功能来说,内存表有以下特征:
1.对于varchar等变长类型,内存表使用固定的长度来存放;
2.内存表可以有非唯一键;
3.内存表不能包含BLOB或者TEXT列;
4.内存表支持AUTO_INCREMENT列;
5.内存表支持插入延迟,使读取优先;
6.非临时内存表和其它非内存表一样在所有客户端直接共享;
我们使用内存表的时候,需要注意以下几个方面:
1.服务器内存足够大;
2.我们创建的内存表和MySQL内部临时表有所不同:
3.当我们单独地delete from 某个内存表的时候,不会回收内存;只有当整个表被delete的时候,才会回收内存;
4.在MySQL的主从服务器上,内存表可以被复制
MySQL内存表容量受两个参数限制,分别是:max_heap_table_size和max_rows,其中max_rows可以在建表的时候添加max_rows = 10000类似的参数放在engine之后。
max_heap_table_size目前有三种修改方式,推荐第二种实测可行(第一没试,第三怎么都无法成功):
1、启动选项中修改
启动mysql的时候加参数 -O max_heap_table_size=64M 。
2、修改my.cnf
在[mysqld]的段中 增加 max_heap_table_size = 32M
3、在mysql客户端工具中修改
mysql>
set max_heap_table_size=32777216;
Query OK, 0
rows affected (0.00 sec)
mysql>
show variables like ‘%heap%‘;
+---------------------+----------+
|
Variable_name | Value |
+---------------------+----------+
|
max_heap_table_size | 32777216 |
+---------------------+----------+
1 row in set (0.00 sec)
具体服务器/etc/my.cnf配置如下,注意红色字体位置,特别注意修改配置文件的是在[mysqld]的段中 增加,有d:
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
max_heap_table_size = 64M
[mysqld_safe]
log-error=/var/log/mysqld.log
配置大小根据实际需要调整,配置完成重启服务即可,service mysqld restart。
性能测试使用mysql自带的mysqlslap,可以使用mysqlslap –help查看具体参数,我们测试直接使用一下语句修改下参数即可:
mysqlslap
--defaults-file=/etc/my.cnf --concurrency=200 --iterations=100
--create-schema=test --query=/home/hefj/test.sql -uroot -pA747107C
其中concurrency为并发量,iterations为测试执行的迭代次数,create-schema为数据库名,query为sql文件(测试sql写好放到服务器上即可执行),后面就是数据库的链接参数,结果如下:
字面理解即可,通过并发除以平均时间可以算出每秒并发数
常用的选项参考:
--concurrency 并发数量,多个可以用逗号隔开
--engines 要测试的引擎,可以有多个,用分隔符隔开,如--engines=myisam,innodb
--iterations 要运行这些测试多少次
--auto-generate-sql 用系统自己生成的SQL脚本来测试
--auto-generate-sql-load-type 要测试的是读还是写还是两者混合的(read,write,update,mixed)
--number-of-queries 总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算
--debug-info 额外输出CPU以及内存的相关信息
--number-int-cols
创建测试表的int型字段数量
--number-char-cols 创建测试表的chat型字段数量
--create-schema 测试的database
--query 自己的SQL
脚本执行测试
--only-print 如果只想打印看看SQL语句是什么,可以用这个选项
Mysql内存表配置及性能测试