天天看點

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語句是什麼,可以用這個選項