摘要:提供了一套統一的應用開發模型和核心,因此,盡管不同的存儲引擎擁有不同的特性,不過對于開發人員,應用操作都是完全透明的。
Mysql 提供了一套統一的應用開發模型和核心 API,因此,盡管不同的存儲引擎擁有不同的特性,不過對于開發人員,應用操作都是完全透明的。應用層的連接并不直接訪問存儲引擎層,而是訪問 Mysql 提供的 Api,也就是說不管所操作的表對象使用什么存儲引擎,讀寫數據時執行的 DDL/DML 語句并沒有不同
下面介紹使用最廣泛的存儲引擎
memory 存儲引擎內存存儲引擎,直接把表保存到內存中,在磁盤中只擁有一個 .frm 文件,用來存儲表結構的定義
通過指定 engine=memory 設置
當 Mysql 服務關閉時,所有 memory 引擎表中的數據全部會丟失
分配給 memory 引擎表的內存,正常情況不會釋放,而是有該表一直持有,即使刪除數據,也不會被收回,只有當整個表被刪除或者重建時才會回收相關內存
memory 引擎表占用多少內存空間?由兩個因素決定
首先 memory 引擎表能使用的最大內存不能超過 max_heap_table_size 系統設置的值,該值默認情況下是 16MB (還可以在會話時,臨時設置 max_heap_table_size 變量的值)
在創建時通過 CREATE TABLE 語句的 MAX_ROWS 選項,指定表中最大的記錄數的方式來限制表能夠使用的內存空間
CSV 存儲引擎CSV 存儲引擎是基于 CSV 格式文件存儲數據
通過指定 engine=csv 設置
CSV 存儲引擎因為自身文件格式的原因,所有列必須強制指定 NOT NULL ,另外 CSV 引擎也不支持索引,不支持分區
CSV 存儲引擎也會包含一個存儲表結構的 .frm 文件,還會創建一個 .csv 存儲數據的文件,還會創建一個同名的元信息文件,該文件的擴展名為 .CSM ,用來保存表的狀態及表中保存的數據量
因為 csv 文件本身就可以直接被編輯,保不齊就有不按規則出牌的情況,如果出現csv 文件中的內容損壞了的情況,也可以使用 CHECK TABLE 或者 REPAIR TABLE 命令檢查和修復
ARCHIVE 存儲引擎ARCHIVE 存儲引擎適用場景恰如其名---歸檔,基于這個存儲引擎,能夠將大量數據壓縮存儲,插入的列會被壓縮
使用了 zlib 無損數據壓縮算法,并且還可以使用 OPTIMIZE TABLE 分析表并使其打包成更小的格式
相同的數據量,ARCHIVE 存儲引擎 比 MyISAM 引擎小了近 8 倍
不足點:
目前 ARCHIVE 引擎僅能夠支持 INSERT 和 SELECT 語句,而不能支持 DELETE、REPLACE、UPDATE 語句
不支持索引
ARCHIVE 引擎除了擁有 .frm 結構文件外,還有一個擴展名為 .arz 的數據文件
BLACKHOLE黑洞存儲引擎,所有插入的數據并不會保存,BLACKHOLE 引擎表永遠保持為空
:) 我這里沒想到什么適用場景,故不做太多介紹
MERGE 存儲引擎MERGE 存儲引擎,也被稱為 MGR_MyISAM 存儲引擎,它實際上是將一組 MyISAM 表聚合在一起,使用時就和一張表一樣
MERGE 存儲引擎,要求聚合的表結構、索引要完全一致
使用 engine=merge union=(表名,表名) 創建
除了保存表結構定義的 .frm 文件外,還有一個擴展名為 .mgr 的文件,這個文件不保存數據,而是保存的數據來源地
MERGE 存儲引擎出了支持 SELECT 之外,還支持 UPDATE、DELETE 語句
需要支持 insert 語句的話,需要配置 INSERT_METHOD 指定插入的記錄保存到哪個表中
INSERT_METHOD 選項有三個值
NO: 不允許插入,這也是默認值
FIRST 插入到第一個表
LAST 插入到最后一個表
MyISAN 存儲引擎如果沒有指定表使用的存儲引擎,那么創建表的默認存儲引擎就是 MyISAN (5.5 以前)
使用 engine=myisam; 設置
默認會創建三個文件
frm 文件,用來存儲表的對象結構
.MYD 文件,用來存儲數據
.MYI 文件,用來存儲索引
MyIASM 特性
最大存儲能力為 256TB
支持 B-tree 索引
支持全文索引
支持索引緩存
支持數據壓縮
支持復制
支持查詢緩存
地理(三維)數據類型支持
地理數據索引支持
支持數據加密
支持統計信息
鎖粒度到 table
支持備份/時間點恢復
MyISAN 不支持的
MVCC 不支持
clustered 索引不支持
hash 索引不支持
不支持事物
不支持數據緩存
不支持外健約束
不支持行級鎖
MyISAM 主要優點是:查詢快,寫入快
MyISAM 支持三種存儲格式:靜態(FIXED)、動態(DYNAMIC)、壓縮(COMPRESSED)
靜態:
靜態指的是,表不包含(varchar/varbinary/blob/text) 靜態表會把以上字段類型會自動填充到達列的長度 較快,易于緩存 易于崩潰后重建 比動態表占用更多的磁盤空間 靜態表,很容易可以到磁盤中的數據文件定位和查找記錄,因為每一行記錄都是固定的
動態:
包含(varchar/varbinary/blob/text) 除了字符串長度小于4的列外,其他字符串的長度都是動態的 比靜態的更節約空間
壓縮:
壓縮表是只允許已讀的,優點在于更節省空間,更快InnoDB 存儲引擎
mysql 5.5 之后。InnoDB 被認定為默認的存儲引擎
InnoDB 有下列關鍵特性
設計遵循 ACID 模型,支持事物,擁有從服務崩潰中恢復的能力,能過最大限度的保護用戶的數據
支持行級鎖,并且引入了類型 Oracle 數據庫中的一致性讀特性,以提升多用戶并發時的讀寫性能
InnoDB 引擎表組織數據時按照主鍵聚族,通過主鍵查找數據時性能極為優異
在維護數據完整性方面,InnoDB 支持外建約束
在服務器發生故障的情況下,Mysql 服務在啟動時,會自動進行故障恢復
InnoDB 擁有自己的緩存池,常用的數據和索引都在緩存中
對于 INSERT,UPDATE,DELETE 操作,會被一種稱為 change buffering 的機制自動優化
什么是 ACID ?
即事物的四個特性:原子性、一致性、隔離性、持久性
InnoDB 存儲引擎的特點
存儲能力 64TB
支持 MVCC
支持 B-tree 索引
支持 Clustered 索引
外建約束
查詢緩存
索引緩存
數據緩存
事物
地理(三維)數據類型支持
數據加密
數據壓縮
統計信息
支持行級鎖
備份/時間點恢復
復制支持
不支持的功能
不支持 Hash 索引
不支持全文索引
地理數據索引支持
InnoDB 和 MyISAM 的區別InnoDB不支持FULLTEXT類型的索引。
InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。
對于AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引。
DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。
LOAD TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,導入數據后再改成InnoDB表,但是對于使用的額外的InnoDB特性(例如外鍵)的表不適用。
另外,InnoDB表的行鎖也不是絕對的,假如在執行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表,例如update table set num=1 where name like “%aaa%”
兩種類型最主要的差別就是Innodb 支持事務處理與外鍵和行級鎖.而MyISAM不支持.所以MyISAM往往就容易被人認為只適合在小項目中使用。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21717.html
摘要:前言在使用加載數據數據庫常見的優化操作后端掘金一索引將放第一位,不用說,這種優化方式我們一直都在悄悄使用,那便是主鍵索引。 Redis 內存壓縮實戰 - 后端 - 掘金在討論Redis內存壓縮的時候,我們需要了解一下幾個Redis的相關知識。 壓縮列表 ziplist Redis的ziplist是用一段連續的內存來存儲列表數據的一個數據結構,它的結構示例如下圖 zlbytes: 記錄整...
閱讀 2750·2023-04-25 14:15
閱讀 2698·2021-11-04 16:11
閱讀 3393·2021-10-14 09:42
閱讀 440·2019-08-30 15:52
閱讀 2825·2019-08-30 14:03
閱讀 3544·2019-08-30 13:00
閱讀 2110·2019-08-26 11:40
閱讀 3306·2019-08-26 10:25