日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql memory_MySQL MEMORY 引擎及性能比对

發布時間:2025/4/17 数据库 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql memory_MySQL MEMORY 引擎及性能比对 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原標題:MySQL MEMORY 引擎及性能比對

同事咨詢MySQL MEMORY引擎的細節,能否滿足需求。沒有太多了解,這里做個系統總結。

MEMORY存儲引擎創建的表數據只能保存在內存。

MySQL宕機、硬件故障或者意外掉電,都會造成MEMORY引擎表丟失數據。所以,MEMORY表中的數據來源于其他表(可落盤永久保存)用于只讀適用,或者用于臨時工作起到數據周轉。

MEMORY 存儲引擎特性

[a] Implemented in the server (via encryption functions). Data-at-rest tablespace encryption is available in MySQL 5.7 and later.

[b] Implemented in the server, rather than in the storage engine.

[c] Implemented in the server, rather than in the storage engine.

來源: https://dev.mysql.com/doc/refman/5.6/en/memory-storage-engine.html

何時使用MEMORY

臨時使用、不重要的數據,例如網站的會話管理和緩存。可接受數據丟失。

發揮其訪問快、低延遲特性

只讀或者大部分是讀操作,不適合大量寫操作。

性能特性

內存表受限于單線程執行和表級鎖引起的爭用。在負載增加時限制了可擴展性,特別是寫操作。

盡管內存表在內存中處理,在繁忙的服務網上,并不一定比InnoDB表更快,如一般查詢或者讀寫場景。特別是,多個會話執行update操作會造成性能低下。

根據不同的SQL查詢,需要創建內存表的默認hash索引(基于鍵的單個值查詢),或者B-tree索引(等值查詢、不等值查詢或者范圍查詢)。

內存表的物理特性

每張內存表會在硬盤上創建一個文件,用于保存表結構(沒有數據)。文件名為以內存表名開始,.frm結尾。

特性

內存表的空間使用小塊(small block)。表使用100%動態hash插入。已刪除的行放到空閑列表中,下次插入新數據會被使用。

使用定長的行存儲格式。變長類型存入內存表需轉換為定長。

不支持BLOB、TEXT類型的列。

內存表支持自增列(AUTO_INCREMENT)

不能在多個會話上共享臨時表。

內存表的DDL操作

創建臨時表

CREATE TABLE t (i INT) ENGINE = MEMORY;

基于非內存表創建內存表,并將數據拉入到內存表中

mysql> CREATE TABLE test ENGINE=MEMORY

-> SELECT ip,SUM(downloads) AS down

-> FROM log_table GROUP BY ip;

mysql> SELECT COUNT(ip),AVG(down) FROM test;

mysql> DROP TABLE test;

內存表的較大受限于 max_heap_table_size 參數,默認為16MB。根據場景需自己調整該參數。

索引

MEMORY存儲引擎支持HASH和BTREE索引。

CREATE TABLE lookup

(id INT, INDEX USING HASH (id))

ENGINE = MEMORY;

CREATE TABLE lookup

(id INT, INDEX USING BTREE (id))

ENGINE = MEMORY;

每張內存表可創建64個索引,每個索引較大支持16個列,一個key的長度較大值為3072bytes。

如果一個內存表hash索引的鍵值有很高的重復度,更新鍵值、刪除操作速度都會顯著降低。這種速度下降的程度與鍵值重復度成正比。您可以使用BTREE索引來規避這個問題。

內存表可以有非鍵(這是hash索引不常用的功能)。

索引列中可包含NULL值。

加載數據

MySQL啟動時,加入--init-file選項,將下列命令加入到這個文件中,保證啟動后內存表中有數據。

INSERT INTO ... SELECT

LOAD DATA INFILE

內存表和復制(Replication)

服務器重啟會導致內存表數據丟失。如果是主庫,從庫沒有意識到主庫表中數據已被情況,所以在從庫你看到的是過期數據。

重啟后,主從庫如何同步內存表數據?

當主庫使用內存表,主庫啟動后,一條DELETE語句會寫入到主庫的binary log中,從庫接到命令后清空內存表。

主庫重啟期間,從庫還是有讀取到過期數據的情況。為了避免這種情況,主庫啟動時加入--init-file參數,這樣主庫啟動自動將數據加載到內存表中。(官方文檔寫的不嚴謹,我認為僅限于內存表只讀場景。如果不是只讀,即使加入--init-file參數也無法保證主庫內存表數據一致)。

管理內存使用情況

服務器必須有足夠內存,來滿足多張內存表的使用。

如果從內存表中刪除單獨的行,并不會回收內存。當整個內存表刪除時,才回收內存。同一張內存表,之前刪除行占用的空間,會被新的行復用。執行DELETE、TRUNCATE TABLE來釋放內存表占用空間,如果表不在使用可使用DROP TABLE命令。釋放正在使用的內存表占用的內存,可以使用 ALTER TABLE XX ENGINE=MEMORY 強制重建表。

內存表1行記錄占用內存計算公式

SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4)

+ SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2)

+ ALIGN(length_of_row+1, sizeof(char*))

ALIGN()表示一個round-up因子,其會導致行長度等于char指針大小的較精確倍數。sizeof(char*)在32位機器上是4,64位則為8。

前面提到, max_heap_table_size 系統變量決定了內存表的較大尺寸。在創建內存之前,可設置該變量控制每個內存表的較大尺寸。(不建議修改全局 max_heap_table_size 的大小,否則所有會話的內存表較大尺寸都為該值 )。

下面的例子創建了2個內存表,較大尺寸為1M和2M

mysql> SET max_heap_table_size = 1024*1024;

Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE t1 (id INT, UNIQUE(id)) ENGINE = MEMORY;

Query OK, 0 rows affected (0.01 sec)

mysql> SET max_heap_table_size = 1024*1024*2;

Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE t2 (id INT, UNIQUE(id)) ENGINE = MEMORY;

Query OK, 0 rows affected (0.00 sec)

服務器重啟后,每個表的尺寸都變成了全局 max_heap_table_size 變量的值大小。

壓測結果

通過sysbench壓測,InnoDB 寫性能完爆MEMORY引擎,MEMORY的讀性能略高于InnoDB。InnoDB的綜合性能更好,足夠滿足日常使用。考慮到MEMORY引擎的雷點太多,建議不使用MEMORY引擎。

文章來源:chinaunix

《MySQL DBA從小白到大神實戰》課程實戰到底,從操作中明白原理,從原理中清楚操作,讓各位童鞋真正的有收獲和徹底消化理解并將其變成自己的技能。返回搜狐,查看更多

責任編輯:

總結

以上是生活随笔為你收集整理的mysql memory_MySQL MEMORY 引擎及性能比对的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。