一、數據庫引擎
數據庫引擎是用於存儲、處理和保護數據的核心服務。利用數據庫引擎可控制訪問權限並快速處理事務,從而滿足企業內大多數需要處理大量數據的應用程序的要求。 使用數據庫引擎創建用於聯機事務處理或聯機分析處理數據的關系數據庫。這包括創建用於存儲數據的表和用於查看、管理和保護數據安全的數據庫對象(如索引、視圖和存儲過程)。
二、數據庫引擎任務
在數據庫引擎文檔中,各主題的順序遵循用於實現使用數據庫引擎進行數據存儲的系統的任務的主要順序。
- 設計並創建數據庫以保存系統所需的關系或XML文檔
- 實現系統以訪問和更改數據庫中存儲的數據。包括實現網站或使用數據的應用程序,還包括生成使用SQL Server工具和實用工具以使用數據的過程。
- 為單位或客戶部署實現的系統
- 提供日常管理支持以優化數據庫的性能
三、MySQL數據庫引擎類別
你能用的數據庫引擎取決於mysql在安裝的時候是如何被編譯的。要添加一個新的引擎,就必須重新編譯MYSQL。在缺省情況下,MYSQL支持三個引擎:ISAM、MYISAM和HEAP。另外兩種類型INNODB和BERKLEY(BDB),也常常可以使用。
ISAM
MYISAM
HEAP
INNODB和BERKLEYDB
四、mysql數據引擎更換方式
1、查看當前數據庫支持的引擎和默認的數據庫引擎:
show engines;
我的查詢結果如下:
2、更改數據庫引擎
2.1、更改方式1:修改配置文件my.ini
將my-small.ini另存為my.ini,在[mysqld]后面添加default-storage-engine=InnoDB,重啟服務,數據庫默認的引擎修改為InnoDB
2.2、更改方式2:在建表的時候指定
建表時指定:
create table mytbl( id int primary key, name varchar(50) )type=MyISAM;
2.3、更改方式3:建表后更改
alter table mytbl2 type = InnoDB;
3、查看修改結果
方式1:
show table status from mytest;
方式2:
show create table table_name
五、MyIASM 和 Innodb引擎詳解
Innodb引擎
Innodb引擎提供了對數據庫ACID事務的支持,並且實現了SQL標准的四種隔離級別,關於數據庫事務與其隔離級別的內容請見數據庫事務與其隔離級別這篇文章。該引擎還提供了行級鎖和外鍵約束,它的設計目標是處理大容量數據庫系統,它本身其實就是基於MySQL后台的完整數據庫系統,MySQL運行時Innodb會在內存中建立緩沖池,用於緩沖數據和索引。但是該引擎不支持FULLTEXT類型的索引,而且它沒有保存表的行數,當SELECT COUNT(*) FROM TABLE時需要掃描全表。當需要使用數據庫事務時,該引擎當然是首選。由於鎖的粒度更小,寫操作不會鎖定全表,所以在並發較高時,使用Innodb引擎會提升效率。但是使用行級鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的范圍,InnoDB表同樣會鎖全表。
名詞解析:
ACID
- A 事務的原子性(Atomicity):指一個事務要么全部執行,要么不執行.也就是說一個事務不可能只執行了一半就停止了.比如你從取款機取錢,這個事務可以分成兩個步驟:1划卡,2出錢.不可能划了卡,而錢卻沒出來.這兩步必須同時完成.要么就不完成.
- C 事務的一致性(Consistency):指事務的運行並不改變數據庫中數據的一致性.例如,完整性約束了a+b=10,一個事務改變了a,那么b也應該隨之改變.
- I 獨立性(Isolation):事務的獨立性也有稱作隔離性,是指兩個以上的事務不會出現交錯執行的狀態.因為這樣可能會導致數據不一致.
- D 持久性(Durability):事務的持久性是指事務執行成功以后,該事務所對數據庫所作的更改便是持久的保存在數據庫之中,不會無緣無故的回滾.
MyIASM引擎
MyIASM是MySQL默認的引擎,但是它沒有提供對數據庫事務的支持,也不支持行級鎖和外鍵,因此當INSERT(插入)或UPDATE(更新)數據時即寫操作需要鎖定整個表,效率便會低一些。不過和Innodb不同,MyIASM中存儲了表的行數,於是SELECT COUNT(*) FROM TABLE時只需要直接讀取已經保存好的值而不需要進行全表掃描。如果表的讀操作遠遠多於寫操作且不需要數據庫事務的支持,那么MyIASM也是很好的選擇。
兩種引擎的選擇
大尺寸的數據集趨向於選擇InnoDB引擎,因為它支持事務處理和故障恢復。數據庫的大小決定了故障恢復的時間長短,InnoDB可以利用事務日志進行數據恢復,這會比較快。主鍵查詢在InnoDB引擎下也會相當快,不過需要注意的是如果主鍵太長也會導致性能問題,關於這個問題我會在下文中講到。大批的INSERT語句(在每個INSERT語句中寫入多行,批量插入)在MyISAM下會快一些,但是UPDATE語句在InnoDB下則會更快一些,尤其是在並發量大的時候。
Index——索引
索引(Index)是幫助MySQL高效獲取數據的數據結構。MyIASM和Innodb都使用了樹這種數據結構做為索引。下面我接着講這兩種引擎使用的索引結構,講到這里,首先應該談一下B-Tree和B+Tree。
MyIASM引擎的索引結構
MyISAM引擎的索引結構為B+Tree,其中B+Tree的數據域存儲的內容為實際數據的地址,也就是說它的索引和實際的數據是分開的,只不過是用索引指向了實際的數據,這種索引就是所謂的非聚集索引。如下圖所示:
這里設表一共有三列,假設我們以Col1為主鍵,則上圖是一個MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件僅僅保存數據記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區別,只是主索引要求key是唯一的,而輔助索引的key可以重復。如果我們在Col2上建立一個輔助索引,則此索引的結構如下圖所示:
同樣也是一顆B+Tree,data域保存數據記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應數據記錄。
Innodb引擎的索引結構
與MyISAM引擎的索引結構同樣也是B+Tree,但是Innodb的索引文件本身就是數據文件,即B+Tree的數據域存儲的就是實際的數據,這種索引就是聚集索引。這個索引的key就是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。
並且和MyISAM不同,InnoDB的輔助索引數據域存儲的也是相應記錄主鍵的值而不是地址,所以當以輔助索引查找時,會先根據輔助索引找到主鍵,再根據主鍵索引找到實際的數據。所以Innodb不建議使用過長的主鍵,否則會使輔助索引變得過大。建議使用自增的字段作為主鍵,這樣B+Tree的每一個結點都會被順序的填滿,而不會頻繁的分裂調整,會有效的提升插入數據的效率。


致謝:感謝您的閱讀!