1. 程式人生 > >MySQL存儲引擎與數據類型

MySQL存儲引擎與數據類型

控制 ddc 字符 sql support insert 分布式 comment 們的

1 數據存儲引擎

存儲引擎的概念是MySQL的一個特性,它指定了表的類型(諸如表怎樣存儲與索引數據、是否支持事務、外鍵等),表在計算機中的存儲方式。

1.1 MySql支持的數據存儲引擎

查看引擎信息

通過命令來查看引擎信息

 show engines;

默認存儲引擎為InnoDB,例如以下列出:

Engine Support Comment Transactions XA Savepoints
InnoDB DEFAULT Supports transactions, row-level locking, and foreign keys YES YES YES
MRG_MYISAM YES Collection of identical MyISAM tables NO NO NO
MEMORY YES Hash based, stored in memory, useful for temporary tables NO NO NO
BLACKHOLE YES /dev/null storage engine (anything you write to it disappears) NO NO NO
MyISAM YES MyISAM storage engine NO NO NO
CSV YES CSV storage engine NO NO NO
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

Support表示是否支持該引擎,Comment表示關於該引擎的評論。Transactions比表示該引擎是否支持事務。XA表示此引擎支持的分布式是否符合XA規範,Savepoints表示此引擎是否支持事務處理中的保存點。

還能夠通過show variables來查看,命令例如以下

show variables like ‘have%‘;  

顯示結果例如以下:

Variable_name Value
have_compress YES
have_crypt NO
have_dynamic_loading YES
have_geometry YES
have_openssl DISABLED
have_profiling YES
have_query_cache YES
have_rtree_keys YES
have_ssl DISABLED
have_statement_timeout YES
have_symlink YES

yes表示支持,no表示不支持,DISABLED表示支持但未開啟


查看默認存儲引擎

show variables like ‘%storage_engine%‘;

查詢結果例如以下:

Variable_name Value
default_storage_engine InnoDB
default_tmp_storage_engine InnoDB
disabled_storage_engines
internal_tmp_disk_storage_engine InnoDB

1.2 改動默認引擎

方式1: 改動my.ini配置文件

在安裝文件夾下的my.ini文件裏加入或改動default-storage-engine,如設置默認引擎為INNODB,在my.ini文件裏加入例如以下一行內容:

default-storage-engine=INNODB 

重新啟動mysql服務生效。

方式2:通過命令設置

一般在創建表時我們能夠設置引擎

CREATE TABLE `test` (
  `db` double DEFAULT NULL,
  `dm` decimal(10,0) DEFAULT NULL,
  `gender` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

當創建完畢,我們希望改動表的引擎時,能夠運行例如以下命令:

 alter table table_name engine= engine_name;

比方我們想設置表test的引擎為MyISAM,能夠運行:

alter table test engine=MyISAM; 

1.3 存儲引擎的選擇

選擇一個合適的存儲引擎,才幹發揮數據庫更好的功能。由於各種數據引擎有著不同的特性優勢與適用場合。因此須要先了解它們的特性。才幹有助於我們更好的選擇合適的引擎。

以下列出了幾種常見的引擎以及他們的特性:
技術分享

MyISAM
此存儲引擎不支持事務、外鍵。但訪問速度快,對事務完整性不要求,適合於對事務沒有要求,並發相對較低,以訪問為主的場合。

InnoDB
支持事務,具有提交、回滾、崩潰恢復的事務安全。相對MySQL來說,寫處理能力差些,且會占用較多磁盤空間以保留數據和索引。在須要進行頻繁的更新刪除操作。實現並發控制,須要支持事務的場合適合使用它。

MEMORY
該存儲引擎使用存在於內存中的內容來創建表,每一個表實際相應一個磁盤文件,格式為.frm;這類表由於數據在內存中,且默認使用HASH索引,所以訪問速度非常快;但一旦服務關閉,表中的數據會丟失。在涉及數據量較小,須要進行高速訪問的場合適用此引擎。


2 數據類型

MySql提供了數據類型來定義我們存儲的數據的類型,不同的數據類型有著不同的存儲功能與占用的空間大小。

Mysql提供的數據類型有:整數類型、浮點數類型與定點數類型、位類型、字符串類型、日期與時間類型。

2.1 整數類型

類型 字節 範圍(有符號) 範圍(無符號)
TINYINT 1 (-128。127) (0。255)
SMALLINT 2 (-32 768。32 767) (0,65 535)
MEDIUMINT 3 (-8 388 608。8 388 607) (0,16 777 215)
INT或INTEGER 4 (-2 147 483 648,2 147 483 647) (0。4 294 967 295)
BIGINT 8 (-9 233 372 036 854 775 808。9 223 372 036 854 775 807) (0。18 446 744 073 709 551 615)

對於整數類型。我們須要依據實際存儲數據的大小來決定我們選擇哪種類型來存儲。諸如當要存儲的數據大小不超過255,我們選擇TINYINT就ok。既滿足要求又節約內存。

在使用的時候,當我們不清楚那個類型的範圍,我們能夠通過幫助命令來查看。諸如查看int類型,我們能夠鍵入 ? int; (或 help int。)來查看int的具體信息。例如以下所看到的:
技術分享

ZEROFILL(0填充)
整形設置0填充,會使類型自己主動成為unsigned,而且各個整形類型都有默認填充位。例如以下圖:

技術分享

2.2 浮點數類型、定點數類型、位類型

浮點數類型

類型 字節 範圍(有符號) 範圍(無符號) 作用
FLOAT 4 (-3.402 823 466 E+38,1.175 494 351 E-38)。0,(1.175 494 351 E-38,3.402 823 466 351 E+38) 0,(1.175 494 351 E-38,3.402 823 466 E+38) 單精度浮點數值
DOUBLE 8 (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0。(2.225 073 858 507 201 4 E-308。1.797 693 134 862 315 7 E+308) 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) 雙精度浮點數值
DECIMAL(M,D) M+2 依賴於M和D的值 依賴於M和D的值 高精度小數值

關於DECIMAL特別指出

  • M是數字的最大數(精度)。其範圍為1~65。M 的默認值是10。M的值為整數的長度加小數的長度,不包括小數點與 “-” 負號。
  • D是小數點右側數字的數目(標度)。

    其範圍是0~30,但不得超過M。假設D省略不寫則默覺得0。此時無小數部分。

  • 存儲整數部分長度為M-D(不滿足會出錯)。小數長度為D(大於D的部分會被截斷)

關於使用方法
對於浮點數類型與DECIMAL的選擇,當我們對小數精度要求非常高時。此時推薦使用DECIMAL類型。由於DECIMAL類型存儲的是字符串,而浮點數類型存儲的是近似值。對於精度要求不高的情況下。視存儲的數據的範圍而定。

做例如以下一個測試
創建一個有float類型的f_data , double 類型的db_data, decimal 類型的 dm_data的表。並同一時候插入123.456到三個字段中。

然後我們查詢123.456的f_data時發現查詢為空,而查詢‘123.456’ 的dm_data時查詢出了結果。實驗驗證了上述結論,float存儲的是近似值。所以查詢不到。而decimal存儲的是字符串,所以能夠精確查詢。


技術分享

位類型

位類型 字節 最大值(位) 最小值(位)
BIT(M) 1~8 BIT(64) BIT(1)

位類型BTM占用的字節數是M,取值在1~8之間。BIT類型的存儲大小視其精度而定。

能夠使用b’value’符號寫位字段值。

value是一個用0和1寫成的二進制值。例如以下:
技術分享

2.3 字符串

2.3.1 char系字符串類型

類型 字節 描寫敘述
CHAR(M) M M為0~255之間的整數
VARCHAR(M) M M為0~65535之間的整數

在數據存儲範圍合適的情況下,當存儲的數據常常變動時使用推薦varchar。否則使用char 。

2.3.2 BINARY系字符串

類型 字節 描寫敘述
BINARY(M) M 長度0~M個字節的定長字節字符串
VARBINARY(M) M 長度0~M個字節的變長字節字符串,值的長度+1個字節

與char系相似,不同的是BINARY系存儲的能夠是二進制數據(如圖片、視頻、音樂)。而char系僅僅能存儲字符數據。

2.3.3 TEXT系字符串類型

類型 字節 描寫敘述
TINYTEXT 0~255字節 值的長度+2個字節
TEXT 0~65535字節 值的長度+2個字節
MEDIUMTEXT 0~167772150字節 值的長度+3個字節
LONGTEXT 0~4294967295字節 值的長度+4個字節

當需存儲大量的字符數據時,能夠選擇TEXT系字符串,至於選擇哪一個看存儲字符長度。

2.3.4 BLOB系字符串

類型 字節
TINYBLOB 0~255字節。值的長度+1個字節
BLOB 0~65535字節。值的長度+2個字節
MEDIUMBLOB 0~167772150字節。值的長度+3個字節
LONGBLOB 0~4294967295字節,值的長度+4個字節

與TEXT系相似。不同的是BLOB系存儲的能夠是二進制數據(如圖片、視頻、音樂),而TEXT系存儲的僅僅能是字符數據

2.3.5 枚舉類型

ENUM(‘value1’,’value2’,…)

枚舉類型僅僅能有一個值的字符串,從值列’value1’。’value2’,…,NULL中或特殊 ”錯誤值中選出。ENUM列最多能夠有65,535個截然不同的值。

ENUM值在內部用整數表示,所以我們能夠使用整數插入或查詢來取代字符串。

例如以下我們創建一個表,包括枚舉字段day,我們插入枚舉值
技術分享

我們還能夠通過整數值插入和查詢
技術分享

當我們插入非設置的枚舉值時會出錯,例如以下錯誤:

mysql> insert into t_enum values(‘星期天‘);
ERROR 1265 (01000): Data truncated for column ‘day‘ at row 1

2.3. 6 SET類型

SET(‘value1’,’value2’,…)

一個set集合。當中的字符串對象能夠有零個或多個值的組合。每一個值必須來自列值’value1’,’value2’。…SET列最多能夠有64個成員。SET值在內部用整數表示。

插入時的數據順序與終於在表中的順序無關。

使用演示樣例

創建了一個t_set的表。day是一個set類型的字段,能夠插入set中的隨意值的組合。插入順序不影響終於插入到表中的數據。能夠通過指定字符串來查詢,此字符串的順序卻對查詢結果有影響,這是一個奇怪的地方
技術分享

使用整數插入、查詢、刪除、更新

set內部使用整數來表示,value、二進制、十進制的相應關系例如以下
技術分享

當我們插入數字15時,即1+2+4+8。各個set的value相應的值(星期一~星期四)
當我們插入數字8時,即相應value為8的‘星期四’,其它組合依次類推
技術分享

刪除指定值(更新與之相似,不列出了)

技術分享


2.4 日期和時間類型

類型名 字節 格式 範圍
date 3 YYYY-MM-DD 1000-01-01 ~ 9999-12-31
datetime 8 YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp 4 YYYY-MM-DD HH:MM:SS 1970-01-01 00:00:01 ~ 2038
year 1 YYYY 1901 ~ 2155
TIME 3 -838:59:59 ~ 838:59:59

通過命令 select curdate(); 或select now();來查看當前日期
技術分享

日期與時間類型的使用

  • 假設要表示年月日,一般使用date
  • 假設要表示年月日時分秒,一般使用datetime
  • 假設要頻繁更新當前時間。則能夠選擇使用timestamp
  • 假設要表示年,能夠使用year,占用字節少
  • 假設要表示時分秒,能夠使用time

使用演示樣例
技術分享


後記:總結了下MySql的存儲引擎與數據類型。更具體的使用方法再慢慢完好吧~

MySQL存儲引擎與數據類型