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语句是什么,可以用这个选项

时间: 2024-10-27 13:52:58

Mysql内存表配置及性能测试的相关文章

MySql 内存表使用

MySql 内存表使用 内存表使用哈希散列索引把数据保存在内存中,因此具有极快的速度,适合缓存中小型数据库,但是使用上受到一些限制,以下是蓝草使用的一些感受. 1.heap对所有用户的连接是可见的,这使得它非常适合做缓存. 2.仅适合使用的场合.heap不允许使用xxxTEXT和xxxBLOB数据类型:只允许使用=和<=>操作符来搜索记录(不允许<.>.<=或>=):不支持auto_increment:只允许对非空数据列进行索引(not null). 注:操作符 “&l

关于mysql内存表的一个帖子(转载)

地址:http://bbs.csdn.net/topics/360030699 引用楼主 zgycsmb 的回复:问:1mysql的内存表性能怎么样2mysql的内存表与system v 这种共享内存机制比起来,如何3 mysql的内存表怎么用,能不能给个例子, thanks 1mysql的内存表性能怎么样 内存表的性能是非常好的,但是取决于你的内存容量,另外它有一个比较致命的弱点,就是一旦出现系统崩溃的情况就会导致数据丢失.2mysql的内存表与system v 这种共享内存机制比起来,如何

MySQL内存表和临时表

#MySQL内存表和临时表 DROP TABLE IF EXISTS tbl; CREATE TABLE tbl ( id INT NOT NULL AUTO_INCREMENT, title VARCHAR (50) NOT NULL, author VARCHAR (50) NOT NULL, PRIMARY KEY (id) ) ENGINE = INNODB DEFAULT CHARSET = utf8; INSERT INTO tbl(title, author) VALUES('Le

MySQL内存表的特性与使用介绍

内存表,就是放在内存中的表,所使用内存的大小可通过My.cnf中的max_heap_table_size指定,如max_heap_table_size=1024M,内存表与临时表并不相同,临时表也是存放在内存中,临时表最大所需内存需要通过tmp_table_size = 128M设定.当数据超过临时表的最大值设定时,自动转为磁盘表,此时因需要进行IO操作,性能会大大下降,而内存表不会,内存表满后,会提示数据满错误.云鼎娱乐城 临时表和内存表都可以人工创建,但临时表更多的作用是系统自己创建后,组织

mysql内存表+临时表

临时表:表在内存里,数据在内存里. 内存表:表在磁盘里,数据在内存里. my.cnf文件中修改 临时表和内存表的大小: [mysqld]  # 内存表容量  max_heap_table_size=1024M  # 临时表容量  tmp_table_size=1024M 创建: 内存表:  注意引擎是memory CREATE TABLE coldtest_vardata ( Id int(11) AUTO_INCREMENT, name varchar(255) ) ENGINE=MEMORY

mysql 内存表

show variables like 'max_%'; max_heap_table_size 16777216     max_tmp_tables 32     show variables like 'tmp_%'; tmp_table_size 1048576000 set global max_heap_table_size=1048576000 set global tmp_table_size=1048576000

MySQL 中的临时表和内存表

内存表: 1.通过My.cnf中的max_heap_table_size指定,支持动态指定 2.表定义是存放在磁盘上的,扩展名为.frm,重启不会丢失,数据是存放在内存中的,所以重启会丢失数据 3.不支持BLOB或TEXT列 4.内存表初始化,可以使用--init-file来初始化,避免重启mysql后数据被清空.比如--init-file="/data/mysql/init.sql", init.sql格式为:          use db_test;          selec

MySQL性能优化-内存参数配置

Mysql对于内存的使用,可以分为两类,一类是我们无法通过配置参数来配置的,如Mysql服务器运行.解析.查询以及内部管理所消耗的内存:另一类如缓冲池所用的内存等. Mysql内存参数的配置及重要,设置不当很有可能会造成很大的性能问题甚至是服务器宕机,内存相关参数的配置需要考虑以下两点: (1)确定可以使用的内存上限: (2)确定Mysql每个连接使用的内存: 在Mysql的体系中(如下图所示),简单来说可以分为两层,第一层代表各种可以用过Mysql连接协议连接到Mysql的客户端,例如PHP.

优化系列 | MySQL Cluster 7.2.7内存表和磁盘表对比测试

一.准备工作自从2009年测试MySQL Cluster 7.0之后,就没怎么关注过它,发展实在太慢了,还有很多不靠谱的地方.前阵子退出7.2.7版本后,看了看新特性介绍,号称性能比以往版本高了很多,于是再关注并进行测试.部署过程不多说,下载PRM包后直接安装即可.共10个节点,其中1个管理节点,其他9个节点同时作为数据和SQL节点,所有节点服务器配置图:MySQL Cluster管理节点关键配置见下: # #ndb config.ini # [TCP DEFAULT] SendBufferMe