1. 程式人生 > >MySQL中的儲存引擎講解(InnoDB,MyISAM,Memory等各儲存引擎對比)

MySQL中的儲存引擎講解(InnoDB,MyISAM,Memory等各儲存引擎對比)

MySQL中的儲存引擎:

1、儲存引擎的概念

2、檢視MySQL所支援的儲存引擎

3、MySQL中幾種常用儲存引擎的特點

4、儲存引擎之間的相互轉化

一、儲存引擎

1、儲存引擎其實就是如何實現儲存資料,如何為儲存的資料建立索引以及如何更新,查詢資料等技術實現的方法。

2、MySQL中的資料用各種不同的技術儲存在檔案(或記憶體)中,這些技術中的每一種技術都使用不同的儲存機制,索引技巧,鎖定水平並且最終提供廣泛的不同功能和能力。在MySQL中將這些不同的技術及配套的相關功能稱為儲存引擎。

二、MySQL 中檢視引擎

1、show  engines;   // 檢視mysql所支援的儲存引擎,以及從中得到mysql預設的儲存引擎。

2、show  variables  like '% storage_engine';    //    檢視mysql 預設的儲存引擎


3、show  create   table  tablename ;   //    檢視具體某一個表所使用的儲存引擎,這個預設儲存引擎被修改了!

4、show  table   status  from  database  where  name="tablename"

//準確檢視某個資料庫中的某一表所使用的儲存引擎


三、MySQL中常用的幾種儲存引擎:innoDB、myisam、memory、BlackHole以及這幾個引擎的講解

innoDB儲存引擎

(1) innodb儲存引擎的mysql表提供了事務,回滾以及系統崩潰修復能力和多版本迸發控制的事務的安全。

(2)innodb支援自增長列(auto_increment),自增長列的值不能為空,如果在使用的時候為空的話怎會進行自動存現有的值開始增值,如果有但是比現在的還大,則就儲存這個值。

(3)innodb儲存引擎支援外來鍵(foreign key) ,外來鍵所在的表稱為子表而所依賴的表稱為父表。

(4)innodb儲存引擎最重要的是支援事務,以及事務相關聯功能。

(5)innodb儲存引擎支援mvcc的行級鎖。

(6)innodb儲存引擎索引使用的是B+Tree

   mvcc類似於java中的讀鎖具體介紹可以看這篇文章:http://blog.csdn.net/chosen0ne/article/details/18093187

MyISAM儲存引擎

1、MyISAM   這種儲存引擎不支援事務,不支援行級鎖,只支援併發插入的表鎖,主要用於高負載的select。

2、MyISAM   型別的表支援三種不同的儲存結構:靜態型、動態型、壓縮型。

(1)靜態型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的資料型別),這樣mysql就會自動使用靜態myisam格式。

        使用靜態格式的表的效能比較高,因為在維護和訪問的時候以預定格式儲存資料時需要的開銷很低。但是這高效能是有空間換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準,佔據了整個空間。

(2)動態型:如果列(即使只有一列)定義為動態的(xblob, xtext, varchar等資料型別),這時myisam就自動使用動態型,雖然動態型的表佔用了比靜態型表較少的空間,但帶來了效能的降低,因為如果某個欄位的內容發生改變則其位置很可能需要移動,這樣就會導致碎片的產生。隨著資料變化的怎多,碎片就會增加,資料訪問效能就會相應的降低。

      對於因為碎片的原因而降低資料訪問性,有兩種解決辦法:

     @1、儘可能使用靜態資料型別

     @2、經常使用optimize   table語句,他會整理表的碎片,恢復由於表的更新和刪除導致的空間丟失。

        (如果儲存引擎不支援 optimize  table    則可以轉儲並重新載入資料,這樣也可以減少碎片)

(3)壓縮型:如果在這個資料庫中建立的是在整個生命週期內只讀的表,則這種情況就是用myisam的壓縮型表來減少空間的佔用。

3、MyISAM也是使用B+tree索引但是和Innodb的在具體實現上有些不同。

MEMORY儲存引擎

(1)memory儲存引擎相比前面的一些儲存引擎,有點不一樣,其使用儲存在內從中的資料來建立表,而且所有的資料也都儲存在記憶體中。

(2)每個基於memory儲存引擎的表實際對應一個磁碟檔案,該檔案的檔名和表名是相同的,型別為.frm。該檔案只儲存表的結構,而其資料檔案,都是儲存在記憶體中,這樣有利於對資料的快速處理,提高整個表的處理能力。

(3)memory儲存引擎預設使用雜湊(HASH)索引,其速度比使用B-+Tree型要快,如果讀者希望使用B樹型,則在建立的時候可以引用。

(4)memory儲存引擎檔案資料都儲存在記憶體中,如果mysqld程序發生異常,重啟或關閉機器這些資料都會消失。所以memory儲存引擎中的表的生命週期很短,一般只使用一次。

BlackHole儲存引擎(黑洞引擎)

(1)支援事務,而且支援mvcc的行級鎖,主要用於日誌記錄或同步歸檔,這個儲存引擎除非有特別目的,否則不適合使用!

四、各儲存引擎相互轉化

1、alter  table  tablename  engine = INnodb /MyISAM/Memory    //       修改了這個表的儲存引擎

優點:簡單,而且適合所有的引擎。

缺點:(1)、這種轉化方式需要大量的時間 和I/O,mysql要執行從舊錶 到新表的一行一行的複製所以效率比較低

(2)、在轉化這期間源表加了讀鎖

(3)、從一種引擎到另一種引擎做錶轉化,所有屬於原始引擎的專用特性都會丟失,比如從innodb到 myisam 則 innodb的索引會丟失!

2、使用dump(轉儲) import(匯入)

優點:使用mysqldump這個工具將修改的資料匯出後會以 .sql 的檔案儲存,你可以對這個檔案進行操作,所以你有更多更好的控制, 如修改表名,修改儲存引擎等!

看看匯出的一個表:

以上就是使用mysqldump 匯出來的表 即 一個 .sql 檔案 你可以按照需求編寫這個檔案,在將這個檔案匯入就ok!

3、第一種方式簡便,第二種方式安全,這第三種方式就算是前兩種方式的折中吧, create  select:

(1)、 create  table   newtable  like  oldtable;

(2)、alter  table  newtable engine= innodb/ myisam / memory

(3)、insert  into  newtable  select * from  oldtable;

如果資料量不大的話這種方式還是挺好的!

還有更高效的辦法就是 增量填充,在填充完每個增量資料塊之後提交一次事務,這樣就不會導致撤銷日誌檔案過大;

(1)start  transaction

(2)insert into newtable  select *  from oldtable  where  id(主鍵) between x and y;

(3) commit

這樣等資料填充之後有了需要的新表,舊錶也存在,不需要的haunt可以刪除,很方便!

相關推薦

MySQL儲存引擎講解InnoDB,MyISAM,Memory儲存引擎對比

MySQL中的儲存引擎: 1、儲存引擎的概念 2、檢視MySQL所支援的儲存引擎 3、MySQL中幾種常用儲存引擎的特點 4、儲存引擎之間的相互轉化 一、儲存引擎 1、儲存引擎其實就是如何實現儲存資料,如何為儲存的資料建立索引以及如何更新,查詢資料等技術實現的方法。 2、M

MySQL儲存引擎講解InnoDB,MyISAM,Memory

一. 儲存引擎 1、儲存引擎其實就是如何實現儲存資料,如何為儲存的資料建立索引以及如何更新,查詢資料等技術實現的方法。 2、MySQL中的資料用各種不同的技術儲存在檔案(或記憶體)中,這些技術中的每一種技術都使用不同的儲存機制,索引技巧,鎖定水平並且最終提供廣泛的不同功能和能力。

mysql資料庫引擎切換InnoDB,MyISAM

mysql更改引擎(InnoDB,MyISAM)的方法,分享給大家供大家參考。具體實現方法如下: mysql預設的資料庫引擎是MyISAM,不支援事務和外來鍵,也可使用支援事務和外來鍵的InnoDB。 檢視當前資料庫的所支援的資料庫引擎以及預設資料庫引擎 資料庫支援

Mysql那些鎖機制之InnoDB

插入記錄 都在 讀一行 利用 分數 .net new 第二版 delet 我們知道mysql在曾經。存儲引擎默認是MyISAM。可是隨著對事務和並發的要求越來越高,便引入了InnoDB引擎。它具有支持事務安全等一系列特性。 InnoDB鎖模式 InnoDB實現了兩種

MySql skip-grant-tables跳過許可權驗證的問題

我們安裝MySql 設定my.ini配置檔案的時候,常常會新增 skip-grant-tables #跳過資料庫許可權驗證 這常常導致一個現象,本地連線資料庫可以使用任意賬號或者密碼。 但是去掉之後,又常常會出現ERROR 1045等問題。 這是可能是因為資料庫中使用者

淺談mysql各種表空間tablespaces的概念

mysql中,會涉及到各種表空間的概念,雖然,很多方面這些概念和Oracle有相似性,但也有很多不同的地方,初學者很容易被這些概念弄的暈頭轉向,從而,混淆這些概念的區別和理解,下面,就簡要介紹和說明一下這些表空間的概念。 1.系統表空間(System Tablespace)    innodb系統表空間包

MySQL的關鍵字用法

MySQL中關鍵字的用法(一) Insert:增加 insert into * values() insert into user values(‘11’,‘諸葛亮’,‘1011’); 不多解釋,向表中新增一條語句,不清楚的去看MySQL的簡單的增刪改查

MySQL鎖詳解行鎖、表鎖、頁鎖、悲觀鎖、樂觀鎖

原文地址:http://blog.csdn.net/mysteryhaohao/article/details/51669741 鎖,在現實生活中是為我們想要隱藏於外界所使用的一種工具。在計算機中,是協調多個程序或執行緒併發訪問某一資源的一種機制。在資料庫當中,除了傳統

mysql的轉換函式講義

--轉換函式: --to_number(數值型別的字元):將字元轉換為數值 --to_char(數值或者是日期):將數值或者日期轉換為字元 --to_date(日期格式的字元):將字元轉換為日期 ----------------數值和字元的互轉----

mysql的變成語句語句塊

在mysql中,如果要執行語句塊程式碼需要使用begin和end;if(判斷語句) then begin #語句.. end; if:case語句(相對於switch case語句);loop(它是死迴圈但是有退出機制)while迴圈:repeat語句

mysql時間查詢函式包括時間戳

這些函式都是MySQL自帶的,可以直接使用在PHP寫的MySQL查詢語句中哦 1-CURDATE()或CURRENT_DATE()和CURTIME()或CURRENT_TIME() 這兩個函式是比較常用到的,顧名思義,第一個返回當前日期,第二個返回當前時間 可以在MySQL

MySQL的關鍵字用法

MySQL中的關鍵字的用法(二) limit:偏移量和數量 注意limit和offset的區別,下面有寫到offset,注意區分; 在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣一個功

mysql條件限制語句like 全匹配 全模糊 distinct limit

5.limit語句: 語法:select 欄位名 from 標明 limit 起始行,查詢幾行; mysql> select * from 4a limit 0,3; +--------+------+--------+------+--------+------+-

mysql許可權和使用注意事項及mysql 資料型別詳解和innodb,myisam區別

mysql使用者許可權管理(Grant,Revoke) MySQL可以為不同的使用者分配嚴格的、複雜的許可權。這些操作大多都可以用SQL 指令Grant(分配許可權)和Revoke(回收許可權)來實現。 Grant可以把指定的權 限分配給特定的使用者,如果這個使用者不存在

在內網安裝軟件內網不能連接外網

-- packages /var/ 自己 配置 內容 pca ges add 一 :制作鏡像光盤 二: /etc/yum.conf 這裏配置文件需要更改 keepcache=0 ==》 keepcache=1 (這裏是更改為“1” 是讓我們保存自己安裝所需要的依

計算機網絡的基本器件網卡,集線器,交換機,路由器

模型 主機 檢測 多個 有一個 決定 拓撲 網絡信息 擁有 1.RJ45接口: RJ45是布線系統中信息插座(即通信引出端)連接器的一種,連接器由插頭(接頭、水晶頭)和插座(模塊)組成,插頭有8個凹槽和8個觸點。RJ是Registered Jack的

mysql 添加時間列用於記錄創建時間和修改時間

var arch csdn too 技術分享 def 兩個 key 分享 在mysql建表的時候需要添加兩個時間列,分別記錄當前記錄的創建時間和修改時間。 好。 下面是建表語句: [sql] view plain copy DRO

MySQL備份腳本V2添加日誌功能及備份後檢查

mysql備份腳本備份腳本#!/usr/bin/env python #_*_coding:utf-8_*_ """ @File: backup_db.py @Author: OldTan @Email: [email protected] @Last Modified: 2018

鏈表翻轉的圖文講解遞歸與叠代兩種實現

art space rst 方式 sin 非遞歸實現 class 添加 技術  鏈表的翻轉是程序員面試中出現頻度最高的問題之一,常見的解決方法分為遞歸和叠代兩種。最近在復習的時候,發現網上的資料都只告訴了怎麽做,但是根本沒有好好介紹兩種方法的實現過程與原理。所以我覺得有必要

spring bean的單例和多例的使用場景和在單例bean注入多例不看後悔,一看必懂

為什麼用單例或者多例?何時用? 之所以用單例,是因為沒必要每個請求都新建一個物件,這樣子既浪費CPU又浪費記憶體; 之所以用多例,是為了防止併發問題;即一個請求改變了物件的狀態,此時物件又處理另一個請求,而之前請求對物件狀態的改變導致了物件對另一個請求做了錯誤的處理;