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