Mysql引擎的知識

什麼是引擎

       存儲引擎是數據庫的發動機,決定數據庫提供的功能和性能。
       使數據用各種不同的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。 存儲引擎說白了就是如何存儲數據、如何爲存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。

mysql支持哪些引擎

mysql支持的引擎
       mysql支持MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、NDBCluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等引擎;主要介紹一下常用的幾個引擎**MyISAM、InnoDB、MEMORY **

1.InnoDB 引擎(MySQL5.5以後默認使用)

MySQL 5.5 及以後版本中的默認存儲引擎,他的優點如下:

災難恢復性好

支持事務

使用行級鎖

支持外鍵關聯

支持熱備份

對於InnoDB引擎中的表,其數據的物理組織形式是簇表(Cluster Table),主鍵索引和數據是在一起的,數據按主鍵的順序物理分佈

實現了緩衝管理,不僅能緩衝索引也能緩衝數據,並且會自動創建散列索引以加快數據的獲取

支持熱備份

2.MyISAM引擎

特性如下:

不支持事務

使用表級鎖,併發性差

主機宕機後,MyISAM表易損壞,災難恢復性不佳

可以配合鎖,實現操作系統下的複製備份、遷移

只緩存索引,數據的緩存是利用操作系統緩衝區來實現的。可能引發過多的系統調用且效率不佳

數據緊湊存儲,因此可獲得更小的索引和更快的全表掃描性能

3.MEMORY 存儲引擎

提供內存表,也不支持事務和外鍵。顯著提高訪問數據的速度,可用於緩存會頻繁訪問的、可以重構的數據、計算結果、統計值、中間結果。

缺點如下:

使用表級鎖,雖然內存訪問快,但如果頻繁的讀寫,表級鎖會成爲瓶頸

只支持固定大小的行。Varchar類型的字段會存儲爲固定長度的Char類型,浪費空間

不支持TEXT、BLOB字段。當有些查詢需要使用到臨時表(使用的也是MEMORY存儲引擎)時,如果表中有TEXT、BLOB字段,那麼會轉換爲基於磁盤的MyISAM表,嚴重降低性能

由於內存資源成本昂貴,一般不建議設置過大的內存表,如果內存表滿了,可通過清除數據或調整內存表參數來避免報錯

服務器重啓後數據會丟失,複製維護時需要小心

MySQL存儲引擎MyISAM與InnoDB如何選擇

1.兩種存儲引擎的大致區別表現在:

1)InnoDB支持事務,MyISAM不支持,這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而MyISAM就不可以了。

2)MyISAM適合查詢以及插入爲主的應用,InnoDB適合頻繁修改以及涉及到安全性較高的應用

3)InnoDB支持外鍵,MyISAM不支持

4)從MySQL5.5.5以後,InnoDB是默認引擎

5)InnoDB不支持FULLTEXT類型的索引

6)InnoDB中不保存表的行數,如select count() from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM只要簡單的讀出保存好的行數即可。注意的是,當count()語句包含where條件時MyISAM也需要掃描整個表。

7)對於自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯合索引。

8)清空整個表時,InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重建表。

9)InnoDB支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like ‘%lee%’

有人說MYISAM只能用於小型應用,其實這只是一種偏見。

如果數據量比較大,這是需要通過升級架構來解決,比如分表分庫,讀寫分離,而不是單純地依賴存儲引擎。

現在一般都是選用InnoDB了,主要是MyISAM的全表鎖,讀寫串行問題,併發效率鎖表,效率低,MyISAM對於讀寫密集型應用一般是不會去選用的。

總之:

1.MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。

2.MyISAM類型的表強調的是性能,其執行速度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。

如何查看修改引擎

看你的mysql現在已提供什麼存儲引擎:
mysql> show engines;

看你的mysql當前默認的存儲引擎:
mysql> show variables like ‘%storage_engine%’;

你要看某個表用了什麼引擎(在顯示結果裏參數engine後面的就表示該表當前用的存儲引擎):
mysql> show create table 表名;

修改mysql的引擎

  • 設置InnoDB爲默認引擎:
    在配置文件my.cnf中的 [mysqld] 下面加入
    default-storage-engine=INNODB 一句
  • 重啓mysql服務器:
    mysqladmin -u root -p shutdown
    或者service mysqld restart 登錄mysql數據庫
  • 修改表引擎方法
    alter table table_name engine=innodb;
  • 關閉Innodb引擎方法 關閉mysql服務: net stop mysql 找到mysql安裝目錄下的my.ini文件: 找到default-storage-engine=INNODB 改爲default-storage-engine=MYISAM 找到#skip-innodb 改爲skip-innodb 啓動mysql服務:net start mysql