1. 程式人生 > >MySQL數據庫存儲引擎

MySQL數據庫存儲引擎

範圍 引擎 修復 就會 內存溢出 incr creat 格式 讀取

何謂存儲引擎 :

MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。這些技術中都使用著不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,能夠各自在不同方面提高對數據增刪改查操作的效率,從而改善你的應用整體功能。

這些不同的技術以及配套的相關功能在MySQL中被稱作存儲引擎(也稱作表類型)。MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啟用。在項目中可根據需求選擇適用於服務器、數據庫和表格的存儲引擎,以便在對數據進行增刪改查時提供最大的靈活性。

修改數據庫引擎 : 

show variables like "default_tmp_storage_engine";

 || show engines;  查看數據庫使用的默認存儲引擎

方式一 : 修改mysql配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf

    [mysqld]後面添加 default-storage-engine=InnoDB

     重啟mysql服務

方式二 : 建表時指定數據庫引擎

     create table mytbl( id int primary key, name varchar(50) )type=MyISAM;  

方式三 : 建表後更改數據庫引擎

     alter table table_name type = InnoDB;

查看數據庫引擎是否更改成功: show table status from table_name; || show create table table_name;

儲存引擎分類 :

MyISAM
特點:不支持事務,也不支持行級鎖和外鍵

   引擎在創建表的時候,會創建三個文件,一個是.frm文件用於存儲表的定義,一個是.MYD文件用於存儲表的數據,另一個是.MYI文件,存儲的是索引。

   MyISAM索引用的 B+ tree索引結構 來儲存數據,MyISAM索引的指針指向的是鍵值的地址,地址存儲的是數據。索引和實際數據是分開存儲的,不過是用索引指向了實際的數據(非聚集索引).

   還使用一種表格鎖定的機制,來優化多個並發的讀寫操作,其代價是你需要經常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。

優勢:擁有較高的插入、查詢速度,訪問速度快

劣勢: 由於不支持事務操作,當表損壞後無法自動恢復

   解決: mysql下的bin目錄中有mysqlcheck.exe是專門修復myisam表損壞的,命令行執行,mysqlcheck -r database tablename -uroot -ppassword -h127.0.0.1 -P3306
使用場景:

  • 選擇密集型的表。MyISAM存儲引擎在篩選大量數據時非常迅速,這是它最突出的優點。
  • 插入密集型的表。MyISAM的並發插入特性允許同時選擇和插入數據。例如:MyISAM存儲引擎很適合管理郵件或Web服務器日誌數據。
  • 對事務完整性沒有要求,即不需要支持事務和支持外鍵的表設計,但是並不代表有事務操作的項目不能用MyIsam存儲引擎,可以在service層進行根據自己的業務需求進行相應的控制。

  • 需要 對表進行加鎖的場景。

  • 需要使用到大量查詢數據select、插入數據insert為主的應用
  • 需要做很多count的計算的。如一些日誌,調查的業務表。

InnoDB
特點:具有提交、回滾和崩潰恢復能力的事務安全,支持行級鎖和外鍵約束

   MyISAM一樣也是使用 B+tree索引結構,但InnoDB的索引文件本身就是數據文件,即B+Tree的數據域存儲的就是實際的數據(聚集索引)
缺點:寫的處理效率差,占用更多的磁盤空間以保留數據和索引。

使用場景:

  • 更新密集的表。InnoDB存儲引擎特別適合處理多重並發的更新請求。
  • 要求可靠性高和支持事務。InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。
  • 自動災難恢復。與其它存儲引擎不同,InnoDB表能夠自動從災難中恢復。
  • 需要支持外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB
  • 支持自動增加列AUTO_INCREMENT屬性。
  • 一般來說,如果需要事務支持,並且有較高的並發讀取頻率,InnoDB是不錯的選擇。

MEMORY(HEAP)

特點:使用內存中的內容來創建表,每個MEMORY表只實際對應一個磁盤文件,訪問速度非常快,默認使用hash索引
缺點:服務一旦關閉,表中的數據就會丟失掉

使用場景:

  • 那些內容變化不頻繁的代碼表,或者作為統計操作的中間結果表,便於高效地堆中間結果進行分析並得到最終的統計結果。
  • 目標數據比較小,而且非常頻繁的進行訪問,在內存中存放數據,如果太大的數據會造成內存溢出。可以通過參數max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小。
  • 數據是臨時的,而且必須立即可用得到,那麽就可以放在內存中(服務器日誌)。

存儲數據特性:要求存儲的數據是數據長度不變的格式,比如,Blob和Text類型的數據不可用(長度不固定的)。

註意: Memory同時支持散列索引和B樹索引,B樹索引可以使用部分查詢和通配查詢,也可以使用<,>和>=等操作符,散列索引相等的比較快,但是對於範圍查詢比較慢。

MyISAMInnoDB之比較 :

  • InnoDB可借助事務日誌(Transaction Log)來恢復程序崩潰(crash),或者非預期結束所造成的數據錯誤;而MyISAM遇到錯誤,必須完整掃描後才能重建索引,或者修正未寫入硬盤的錯誤。
  • InnoDB的修復時間,大略都是固定的,但MyISAM的修復時間,則與數據量的多少成正比。相對而言,隨著數據量的增加,InnoDB會有較佳的穩定性。
  • MyISAM必須依靠操作系統來管理讀取&寫入的緩存,而InnoDB是有自己的讀寫緩存管理機制。InnoDB不會將被修改的數據立即交給操作系統,在某些情況,InnoDB的數據訪問會比MyISAM更高效率。
  • InnoDB支持事務&行級鎖&外鍵&全文索引,而MyISAM不支持事務&行級鎖&外鍵&全文索引

技術分享圖片

MySQL數據庫存儲引擎