談談MySQL存儲引擎

本文首發於我的微信公衆號《andyqian》,期待你的關注!

前言

  你們週末過的還愉快嗎?一眨眼周末就過去了,明天得上班寫BUG了。What?寫BUG?沒錯,就是寫BUG,爲此測試」房姐」調侃了我很多,就差沒叫我「BUG」了,還在上週告訴了我一個永無BUG的方法。聽到答案的我」面紅耳赤」的繼續寫BUG。答案是什麼?大家先猜猜看?mysql

引子

  在以前的文章中咱們說過MySQL事務,如今你們都應該知道了MySQL事務了吧,還記得事務的ACID原則嗎?不記得的童鞋能夠回顧一下《MySQL之事務初識》,其實呀,更嚴謹一點的話,應該是MySQL InnoDB存儲引擎,由於在MySQL中,只有InnoDB存儲引擎才支持事務。看到此處,有些朋友可能有如下疑問:sql

  • 存儲引擎是什麼?數據庫

  • MySQL中有哪些存儲引擎?安全

  • 每一個存儲引擎有哪些特色以及區別?服務器

下面,咱們帶着這些疑問,依次往下看:微信

存儲引擎是什麼?

  通俗一點來講,MySQL是用來保存數據的對不對?咱們能夠把存儲引擎看做是一種存儲文件的方式以及該方式附屬的一整套工具,其中每一個存儲文件方式的特色就是該存儲引擎的特色。併發

例如:Memory存儲引擎將數據保存至內存中,其優勢是:讀寫快,可是數據不是持久到磁盤中的,很是容易丟失等等。app

MySQL中的存儲引擎

  在MySQL 5.7版本中,MySQL支持的存儲引擎有:ide

  • InnoDB工具

  • MyISAM

  • Memory

  • CSV

  • Archive

  • Blackhole

  • Merge:

  • Federated

  • Example

下面只介紹經常使用的存儲引擎,其餘沒介紹的存儲引擎,有興趣的童鞋,能夠本身自行搜索。

InnoDB:支持事務操做(如 begin, commit,rollback命令),支持行級鎖,行級鎖相對於表鎖,其粒度更細,容許併發量更大,這裏面細節還挺多的,下次,咱們單獨寫一篇)支持外鍵引用完整性約束。InnoDB存儲引擎也是MySQL 5.7版本中默認的存儲引擎。其缺點是:存儲空間會佔用比較大。

MyISAM:該存儲引擎存儲佔用的空間相對與InnoDB存儲引擎來講會少不少,但其支持的爲表鎖,其併發性能會低不少,並且不支持事務,一般只應用於只讀模式的應用。它是MySQL最原始的存儲引擎。

Memory:該存儲引擎最大的特色是,全部數據均保存在內存中,以前還有個名字叫作 「Heap」。
應用場景: 主要存儲一些須要快速訪且非關鍵數據,爲何不是關鍵數據呢?就由於其全部數據保存在內存中,也能夠理解爲不安全。

CSV:首先先認識一下CSV,CSV文件其實就是用逗號分隔開的文本文件,經常使用於數據轉換,該類型平時用的比較少,不支持索引。

Archive:存檔文件,主要用於存儲不多用到的引用文件,

Example:該存儲引擎主要用於展現如何自行編寫一個存儲引擎,通常不會用做生產環境使用。

如何選擇存儲引擎

  你們經過上面的比較應該已經看出來了,InnoDB存儲引擎是支持事務,支持外鍵並支持行級鎖的。對於須要在線事務處理的應用最合適不過了,咱們在選擇存儲引擎時,若是沒有特別的理由,個人建議是選擇InnoDB做爲存儲引擎。

  1. 咱們能夠在建立table時,指定存儲引擎,若是未指定,則使用默認的存儲引擎。

    create table t_base_user(
    oid bigint(20) not null primary key auto_increment comment "",
    created_at datetime null comment ''
    )engine=innodb
  2. (方法一) 顯示該表的存儲引擎

    mysql> show table status like "t_base_user" \G;
    *************************** 1. row ***************************
            Name: t_base_user
          Engine: InnoDB
         Version: 10
      Row_format: Dynamic
            Rows: 0
    Avg_row_length: 0
     Data_length: 16384
    Max_data_length: 0
    Index_length: 0
       Data_free: 0
    Auto_increment: 1
     Create_time: 2017-12-17 20:10:24
     Update_time: NULL
      Check_time: NULL
       Collation: utf8_unicode_ci
        Checksum: NULL
    Create_options: 
         Comment: 
    1 row in set (0.01 sec)
  3. (方法二) 顯示錶的存儲引擎信息

    mysql> show create table t_base_user\G;
    *************************** 1. row ***************************
        Table: t_base_user
    Create Table: CREATE TABLE `t_base_user` (
    `oid` bigint(20) NOT NULL AUTO_INCREMENT,
    `created_at` datetime DEFAULT NULL,
    PRIMARY KEY (`oid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    1 row in set (0.00 sec)

    另外須要注意的是: 不建議修改表的存儲引擎,在建立表時,就要須要考慮好,使用什麼存儲引擎。

今日命令

命令: show engines;
標準語法show stroage engines;
其中stroage爲可選項。
做用:顯示當前MySQL版本支持的存儲引擎。
例子(MySQL版本: 5.7.20):

mysql> show storage engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES    | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+---------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

使用場景:在查看當前數據庫版本支持的存儲引擎,查看默認存儲引擎時很是實用。

Engine:存儲引擎名稱。
Support: 表示MySQL當前服務器版本是否支持該存儲引擎,YES爲支持 NO 爲不支持。
Comment:爲該存儲引擎的特性,如Innodb
支持事務,行級鎖等。
Transactions:是否支持事務,YES爲支持,No爲不支持。
XASavepoints:這兩個屬性,與事務相關,當Transactions爲Yes時,這兩個屬性纔有意義,不然均爲NO。

相關閱讀:

寫會MySQL索引  

十個實用MySQL命令

說說 MySQL JSON 數據類型

淺談MySQL Online DDL(下)

最後:「房姐」 說的永無BUG的方法是:「不寫代碼」。

 

這裏寫圖片描述

 掃碼關注,一塊兒進步

我的博客: http://www.andyqian.com

相關文章
相關標籤/搜索