1. 程式人生 > 其它 >mysql一個表中根據其分類查不同過的表_MySQL常用儲存引擎特點及適用場景全解析,你想要的都在這裡

mysql一個表中根據其分類查不同過的表_MySQL常用儲存引擎特點及適用場景全解析,你想要的都在這裡

技術標籤:mysql一個表中根據其分類查不同過的表mysql資料丟失將查詢結果儲存到一個新建的資料表或臨時表中的命令是

前言

MySQL作為當前最火熱的開源分散式資料庫,基本滿足絕大多數關係型資料庫的應用場景,比如對事務的要求,讀寫分離的要求,報表的要求。由於Mysql功能的強大並且是開源的,很多知名的網際網路公司基於MYSQL開源特性,在MYSQL上進行封裝,衍生出自己的產品,比如:騰訊的TiDB。
業務場景複製多樣,對資料庫的要求也不同,那Mysql是怎麼樣支援這些使用場景的呢,比如:要求查詢速度快,更新、刪除快,大資料的要求。下面就以儲存引擎角度來分析Mysql對不同應用場景的支援。

30037bd4176e8edd85a7615c9d724025.png

一、儲存引擎怎麼定義?

在建立表時,可以顯示的指定資料庫表的儲存引擎:ENGINE=MyISAM

CREATE TABE TEST(Id long not null ,name varchar(20))ENGINE=MyISAM 

檢視當前資料庫支援的儲存引擎:

mysql> show engines ;

在存在的資料表中指定儲存引擎:

mysql> alter table emp engine=innodb;

二、常見儲存引擎分類

1.MyISAM

特徵

  1. 不支援事務和外來鍵;
  2. 只有表級鎖;
  3. 一個數據庫表存在三個檔案:a.表結構定義(.frm) b.表索引(.MYI ) c.表資料(.MYD)
  4. 採用B+樹的索引方式,所有葉子節點儲存的是資料地址
    MyISAM儲存引擎的資料表還分為以下三種類型:
    (1)、靜態表(fixed)
    預設的儲存格式,靜態表中的欄位都是非變長欄位,每個記錄都是固定的長度,當表不包含變數長度列(VARCHAR, BLOB, 或TEXT)時,使用這個格式。
    優點:儲存迅速,出現故障容易恢復
    缺點:佔用空間比動態表大,靜態表在進行資料儲存時會按照事先定義的列寬度補足空格,但在訪問的時候會去掉這些空格
    (2)、動態表(dynamic)
    包含變長欄位,例如varchar、、text、blob,如果一個MyISAM表包含任何可變長度的欄位(varchar、blob、text),或者該表建立時用row_format=dynamic指定,則該表使用動態格式儲存
    優點:佔用空間小
    缺點:頻繁的更新和刪除操作會產生碎片,需要定期用optimize table語句或myisamchk -r命令來改善效能,並且在出現故障後較難恢復
    (3)、壓縮表
    由myisampack工具建立,佔據非常小的磁碟空間,因為每個記錄都是被單獨壓縮的

2.InnoDB

Innodb是MySQL預設的儲存引擎,與MyISAM相比,有如下明顯的特徵:

  1. 主鍵自增:innoDB表的自動增長列必須是索引,如果是組合索引,也必須是組合索引的第一列,MyISAM表的自動增長列可以是組合索引的其他列
  2. 完備的事務控制和外來鍵約束。
  3. 表定義會兩個儲存檔案,a.表結構定義(.frm) b.表資料+表索引(.MYD),即表資料和索引是在同一個檔案中,索引也是使用B+樹儲存索引資訊,B+樹的葉子節點儲存的是實際的索引資料,而非地址(區別於MyISAM)。

如果沒有顯式指定,則 MySQL系統會自動選擇一個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則MySQL 自動為 InnoDB 表生成一個隱含欄位作為主鍵,型別為長整形。請儘量在 InnoDB 上採用自增欄位做表的主鍵。因為 InnoDB 資料檔案本身是一棵B+Tree,非單調的主鍵會造成在插入新記錄時資料檔案為了維持 B+Tree 的特性而頻繁的分裂調整,十分低效,而使用自增欄位作為主鍵則是一個很好的選擇。如果表使用自增主鍵,那麼每次插入新的記錄,記錄就會順序新增到當前索引節點的後續位置,當一頁寫滿,就會自動開闢一個新的頁。**聚集索引這種實現方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。

優缺點:

  • 優勢在於提供了良好的事務管理、奔潰修復能力和併發控制。
  • 缺點是讀寫效率稍差,佔用的資料空間相對比較大。

適用場合:

  • 更新密集的表:InnoDB儲存引擎特別適合處理多重併發的更新請求。
  • 事務:InnoDB儲存引擎是唯一支援事務的標準MySQL儲存引擎,這是管理敏感資料(如金融資訊和使用者註冊資訊)的必須軟體
  • 自動災難恢復:與其他儲存引擎不一樣,InnoDB表能夠自動從災難中恢復。雖然MyISAM表也能在災難後修復,但其過程要長的多

3.MEMORY

顧名思義,表資料儲存在記憶體中,也就具有如下特點:

  1. 表定義在一個檔案.frm檔案中,表資料在記憶體中儲存。
  2. 表索引是通過HASH實現
  3. 資料讀取速度快,但是不安全,資料庫關閉後,資料也會丟失。
  4. 適用內容變化不頻繁的程式碼表,作為統計操作的中間結果表,便於利用它速率快的優勢高效的對中間結果進分析。

MEMORY儲存引擎的優缺點:

  • MEMORY表的大小是受到限制的。表的大小主要取決於兩個引數,分別是max_rows和max_heap_table_size。其中,max_rows可以在建立表時指定:max_heap_table_size的大小預設為16MB,可以按需要進行擴大。因其存在記憶體中的特性,這類表的處理速度非常快。但是其資料容易丟失,生命週期短。(注意:mysqld守護程序崩潰時,所有的MEMORY資料都會丟失)
  • MEMORY表不支援VARCHAR、BLOB、TEXT資料型別,因為這種表型別按固定長度的記錄格式儲存。此外,如果使用版本4.1.0之前的MySQL,這不支援自動增長列。

適用場景:

  • 暫時:目標資料只是臨時需要,在其生命週期中必須立即可用。
  • 相對無關:儲存在MEMORY表中的資料如果突然丟失,不會對應用服務產生實質的負面影響,而且不會對資料完整性有長期影響。

總結

一般的資料庫調優可能都停留在SQL層面的優化,通過了解MYSQL底層的儲存引擎,可以根據不同的業務場景提供另外一條不一樣的思路。本文只列出常見的幾種儲存引擎,如果想詳細瞭解每種引擎可以參考MYSQL官網。例如針對查詢插入比較多時,可以採用MyISAM儲存引擎。針對更新刪除比較多的表採用預設的InnoDB引擎。如果針對那些不會改變又會頻繁訪問的資料或者中間表資料可以採用MEMORY引擎。同樣如果時存檔需求還可以使用ACHIVE引擎。

喜歡文章請多多點贊評論轉發,關注小編,你們的支援就是小編最大的動力~~~