# 存儲引擎
## InnoDB 存儲引擎
InnoDB 是事務性數據庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵。MySQL5.5.5 之后,InnoDB 作為默認存儲引擎。InnoDB 主要特性有:
* InnoDB 給 MySQL 提供了具有提交、回滾和崩潰恢復能力的事務安全(ACID 兼容)存儲引擎。InnoDB 鎖定在行級并且也在 SELECT 語句中提供一個類似 Oracle 的非鎖定讀。這些功能增加了多用戶部署和性能。在 SQL 查詢中,可以自由地將 InnoDB 類型的表與其他 MySQL 的表的類型混合起來,甚至在同一個查詢中也可以混合。
* InnoDB 是為處理巨大數據量所設計的性能為重的,它的 CPU 效率可能是任何其他基于磁盤的關系數據庫引擎所不能匹敵的。
* InnoDB 存儲引擎完全與 MySQL 服務器整合,InnoDB 存儲引擎在主內存中維持了自己的緩沖池來緩存數據和索引。InnoDB 將它的表和索引存在一個邏輯表空間中,表空間可以包含數個文件(或原始磁盤分區)。這與 MyISAM 表不同,比如在 MyISAM 表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制在 2GB 的操作系統上。
* InnoDB 支持外鍵完整性約束(FOREIGN KEY)。存儲表中的數據時,每張表的存儲都按主鍵順序存放,如果沒有顯式在表定義時制定主鍵,InnoDB 會為每一行生成一個 6B 的 ROWID,并以此作為主鍵。
* InnoDB 被用在眾多需要高性能的大型數據庫站點上。
* InnoDB 不創建目錄,使用 InnoDB 時,MySQL 將在 MySQL 數據目錄下創建一個名為 ibdata1 的 10MB 大小的自動擴展數據文件,以及兩個名為 ib_logfile0 和 ib_logfile1 的 5MB 大小的日志文件。
### InnoDB文件格式
`frm`:表格式
`Ibd`:表數據、索引(InnoDB data)
### 聚集索引
葉子節點包含完整的數據記錄
## MyISAM 存儲引擎
MyISAM 是基于 ISAM 的存儲引擎,并對其進行擴展。它是在 Web、數據存儲和其他應用環境下最常使用的存儲引擎之一。MyISAM 擁有較高的插入、查詢速度,但不支持事務。在 MySQL5.5.5 之前的版本中,MyISAM 是默認存儲引擎。MyISAM 主要特性有:
* 大文件(達 63 位文件長度)在支持大文件的文件系統和操作系統上被支持。
* 當把刪除、更新及插入操作混合使用的時候,動態尺寸的行產生更少碎片。這要通過合并相鄰被刪除的塊,以及若下一個塊被刪除,就擴展到下一塊來自動完成。
* 每個 MyISAM 表最大索引數是 64,這可以通過重新編譯來改變。每個索引最大的列數是 16 個。
* 最大的鍵長度是 1000B,這也可以通過編譯來改變。對于鍵長度超過 250B 的情況,一個超過 1024B 的鍵將被用上。
* BLOB 和 TEXT 列可以被索引。
* NULL 值被允許在索引的列中。這個值占每個鍵的 0-1 個字節。
* 所有數字鍵值以高字節優先被存儲以允許一個更高的索引壓縮。
* 每表一個 AUTO_INCREMENT 列的內部處理。MyISAM 為 INSERT 和 UPDATE 操作自動更新這一列。這使得 AUTO_INCREMENT 列更快(至少 10%)。在序列項的值被刪除之后就不能再利用。
* 可以把數據文件和索引文件放在不同目錄。
* 每個字符列可以有不同的字符集。
* 有 VARCHAR 的表可以固定或動態記錄長度。
* VARCHAR 和 CHAR 列可以多達 64KB。
* 使用 MyISAM 引擎創建數據庫,將產生 3 個文件。文件的名字以表的名字開始,擴展名代表了文件的類型:frm 文件存儲表定義,myd 代表數據文件,myi 代表索引文件。
### MyISAM文件格式
`frm`:表格式
`MYD`:表數據(MyISAM data)
`MYI`:表索引(MyISAM Index)
## MEMORY 存儲引擎
MEMORY 存儲引擎將表中的數據存儲到內存中,為查詢和引用其他表數據提供快速訪問。MEMORY 主要特性有:
* MEMORY 表的每個表可以有多達 32 個索引,每個索引 16 列,以及 500B 的最大鍵長度。
* MEMORY 存儲引擎執行 HASH 和 BTREE 索引。
* 可以在一個 MEMORY 表中有非唯一鍵。
* MEMORY 表使用一個固定的記錄長度格式。
* MEMORY 不支持 BLOG 或 TEXT 列。
* MEMORY 支持 AUTO_INCREMENT 列和對可包含 NULL 值的列的索引。
* MEMORY 表在所有客戶端之間共享(就像其他任何非 TEMPORARY 表)。
* MEMORY 表內容被存在內存中,內存是 MEMORY 表和服務器在查詢處理時的空閑中創建的內部表共享的。
* 當不再需要 MEMORY 表的內容時,要釋放被 MEMORY 表使用的內存,應該執行 DELETE FROM 或 TRUNCATE TABLE,或者刪除整個表(用 DROP TABLE)。
- 簡介
- php
- php基礎
- php常用數組函數
- php常用字符串函數
- php魔術方法
- php高階
- swoole
- php優化
- workerman
- PHP底層運行機制和原理
- php框架
- laravel
- 前端
- react
- 爬蟲
- Scrapy
- Linux
- IO復用
- nginx
- nginx進程工作原理
- nginx配置
- 正向代理反向代理
- UPSTREAM
- SERVER
- HTTPS
- queue
- kafka
- redis
- DB
- mysql
- 存儲引擎
- 索引
- 鎖
- 觸發器
- 分庫分表
- 三范式
- 負載均衡
- 事務
- EXPLAN
- mysql死鎖
- mysql索引覆蓋與回表
- mysql聚簇索引與非聚簇索引
- NoSql
- memcache
- redis
- mongo
- 網絡協議
- tcp與udp
- https與http
- 架構
- LNMP架構下HTTP請求的調用次序
- 數據結構&算法
- 基礎數據結構
- Linked List
- array
- stack
- queue
- tree
- hash
- heap
- 常見算法
- 排序算法
- 查找算法
- 其他
- php的一些坑
- 常問面試題
- 技術面試最后反問面試官的話
- hr
- redis緩存擊穿、穿透、雪崩
- 面試中回答的不好的問題
- web攻擊防范