MySQL5.7

1 基本信息

1.4 新特性

  • SQL mode changes. 默認會設置爲STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION刪除了幾個,其中NO_ENGINE_SUBSTITUTION表示若是新建表的引擎不存在,則提示報錯 ,若是不設置NO_ENGINE_SUBSTITUTION,指定表的引擎不存在時默認使用InnoDB;STRICT_TRANS_TABLES表示批量 Insert是若是第一條失敗則都失敗。
  • Online ALTER TABLE. 不須要再經過複製表就能夠直接修改索引名稱。
  • JSON support. 支持JSON類型,
  • 空間類型
  • 移除YEAR(2)

7 備份與恢復

7.1 備份與恢復類型

11 Data Types

包含:python

  • 數值類型
  • 時間日期類型
  • 字符類型,String,Char,Byte
  • 空間類型
  • JSON類型

11.1 數據類型概述

11.1.1 數值類型

對於整數,M表示顯示的最大寬度;
對於浮點與定點數,M表示能夠存儲的總位數;
若是對錶字段設定ZEROFILL,該字段默認加上無符號類型屬性;
默認爲有符號類型;
序列號SERIAL:無符號,Not NULL,自增,BIGINT,UNIQUEmysql

Warning
2個數字作減法,其中有一個爲無符號類型,則結果也爲無符號類型。但設置 NO_UNSIGNED_SUBTRACTION (SQL mode)時,結果爲有符號類型。sql

  • BIT [(M))]
    BIT類型,M表示位數,默認爲1,M範圍爲[1,64]
  • TINYINT [(M)] [UNSIGNED] [ZEROFILL]
    小整數(8bit),有符號範圍爲[-128, 127],無符號範圍爲[0,255]
  • BOLL BOOLEAN
    TINYINT(1)的同義詞,值爲0表示false,非0表示true
mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false                  |
+------------------------+

mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+

mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+
複製代碼

然而,TRUE與FALSE僅僅分表表示1與0,實例以下:安全

mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true                           |
+--------------------------------+

mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true                          |
+-------------------------------+

mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false                         |
+-------------------------------+

mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false                          |
+--------------------------------+
複製代碼

最後2段示例結果是由於2既不等於0也不等於1,也間接說明TRUE,FALSE的值爲1,0。服務器

  • SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
    小整數(16bit),有符號範圍爲[-32768,327670],無符號範圍爲[0,65535]數據結構

  • MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
    中等大小整數(24bit),有符號範圍爲[-8388608,8388607],無符號範圍爲[0,16777215]併發

  • INT[(M)] [UNSIGNED] [ZEROFILL]
    整數(32bit),有符號範圍爲[-2147483648,2147483647],無符號範圍爲[0,4294967295]函數

  • INTEGER[(M)] [UNSIGNED] [ZEROFILL]
    INT的同義類型性能

  • BIGINT[(M)] [UNSIGNED] [ZEROFILL]
    大整數(64bit),有符號範圍爲[-9223372036854775808,9223372036854775807],無符號範圍爲[0,18446744073709551615]
    SERIAL:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
    關於BITINT字段你應該注意以下事項:ui

    • 全部算術運算都是使用有符號的BITINT或者DOUBLE,因此不該該使用超過9223372036854775807 (63 bits)的無符號BITINT,BIT運算可使用64bit;另外BITINT轉換爲DOUBLE出現舍入可能致使結果錯誤。
      在如下狀況下,MYSQL能夠處理BITINT:
      • 存儲無符號整數數值
      • MIN(col_name)或者MAX(col_name)
      • 使用操做符(+,-,*等),2個操做數都爲整數
    • 能夠存儲一個字符串(能轉換爲整數)到BITINT,MYSQL會執行字符串到整形的轉換。
    • 運算溢出,若是對2個很大的數進行相乘,可能獲取到非預期的值。
  • DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
    定點數,十進制數。M爲總位數(精度),D爲小數點後位數(複數),M不包含小數點與符號位(-)。若是D爲0,則沒有小數點或小數部分。十進制數的最大位數(M)爲65,D支持的最大值爲30,若是省略D,則默認爲0,若是省略M,則默認爲10。
    設定爲無符號,則不容許負數。
    針對十進制字段的全部基本操做(+,-,*,/)以65位精度來完成。

  • FLOAT[(M,D)] [UNSIGNED:] [ZEROFILL]
    單精度浮點數。值範圍-3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38. 這是理論限值,實際範圍依賴於CPU硬件與操做系統。
    FLOAT(M,D)是非標準的MYSQL擴展。
    若是指定了UNSIGNE,則不容許負數。
    M表示總位數,D表示小數點後位數。若是省略M與D,則可存儲的大小依賴於硬件。單精度浮點數精確到約7位小數。D,則不容許負數。
    使用FLOAT時,由於MYSQL中以DOUBLE精度來運算,因此可能會出現一些非預期的問題。

  • DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    雙精度浮點數。範圍爲:-1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308.這是理論限值,實際範圍依賴於CPU硬件與操做系統。
    M表示總位數,D表示小數點後位數。若是省略M與D,則可存儲的大小依賴於硬件。單精度浮點數精確到約15位小數。
    DOUBLE(M,D)是非標準的MYSQL擴展。
    若是指定了UNSIGNE,則不容許負數。

11.1.2 時間日期類型

時間類型概述。關於時間類型的屬性與存儲要求的更新信息,請參見11.3節 「Date and Times Types」,11.8節「Date Type Storage Requirements」;關於時間的運算操做,見12.7節「Date and Times Functions」。
對於DATE與DATETIME範圍描述中,「supported」意味着即便早期版本的值可能有效,但沒有保證。
MYSQL容許TIME,DATETIME,TIMESTAMP的秒帶有小時部分,即微秒(6位)精度,經過type_name(fsp)來定義微妙,例如:

create table t1 (t TIME(3), dt datatime(6));

mysql> select * from t1;
+--------------+----------------------------+
| t            | dt                         |
+--------------+----------------------------+
| 11:38:59.000 | 2019-08-03 11:39:05.000000 |
+--------------+----------------------------+
1 row in set (0.00 sec)
複製代碼

fsp值範圍爲[0,6],0表示沒有微秒,若是忽略,默認爲0。(與MYSQL標準不一樣的是,標準默認是6,這是爲了兼容早期版本)
任何TIMESTAMP或者DATETIME表字段都有自動初始化與更新屬性。

  • DATE
    範圍爲‘1000-01-01’到‘9999-12-31’。MYSQL以‘YYYY-MM-DD’顯示DATE字段,但容許使用字符串或者數值來賦值。
  • DATETIME[(fsp)]
    範圍爲‘1000-01-01 00:00:00.000000’到‘9999-12-31 23:59:59.999999’。MYSQL以‘YYYY-MM-DD hh:mm:ss[.fsp]’顯示DATETIME字段,但容許使用字符串或者數值來賦值。 經過設置DEFAULT與ON UPDATE屬性能夠自動初始化以及自動更新爲當前時間,將在11.35節「Automatic Initialization and Updating For TIMESTAMP and DATETIME」中描述。
  • TIMESTAMP[(fsp)]
    時間戳。範圍爲:'1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC。TIMESTAMP存儲的是從('1970-01-01 00:00:00' UTC)開始的秒數。TIMESTAMP不能表示'1970-01-01 00:00:00',由於該值等於0(從起始時間計算的秒數),而0被保留用來表示'0000-00-00 00:00:00'。
    (TODO 還有小部分未翻譯)
  • TIME[(fsp)]
    範圍:'-838:59:59.000000' to '838:59:59.000000'。MYSQL以‘hh:mm:ss[.fraction]’顯示TIME字段,但容許使用字符串或者數值來賦值。
    選項fsp範圍爲[0,6]用來指定微秒部分,若是不指定默認爲0。
  • YEAR[(4)]
    範圍:1901到2155, and 0000。MYSQL以‘YYYY’顯示YEAR字段,但容許使用字符串或者數值來賦值。

時間類型不能使用SUM(),AVG()聚合函數,由於轉換爲數值的時候遇到第一個非數字字符後丟失後面的全部內容。爲了規避這個問題,先轉換爲數字,而後執行聚合函數,而後再轉換回時間類型。

SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;

11.1.3 字符類型
  • [NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
    一個固定長度的字符串,在存儲時老是用空格填充到指定的長度。m以字符表示列長度。m的範圍是0到255。若是省略m,則長度爲1。

    檢索char值時會刪除尾隨空格,除非啓用pad-char-to-full-length SQL模式。

  • [NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]
    可變長度字符串。m以字符表示最大列長度。m的範圍是0到65535。使用1-2個字節來存儲長度字段,若是不超過255長度,則一個字符,若是超過這2個字節。

    MySQL遵循標準的SQL規範,不會從varchar值中刪除尾隨空格。

11.2 數字類型

11.2.1 整數類型
11.2.2 定點數類型(DECIMAL, NUMERIC)

小數和數字類型存儲精確的數字數據值。當須要保持精確的精度時,例如貨幣數據時,可使用這些類型。在MySQL中,numeric被實現爲decimal,所以下面關於decimal的註釋一樣適用於numeric。
MySQL以二進制格式存儲十進制值。見第12.22節「Precision Math」。
在十進制列聲明中,能夠(一般)指定精度和小數位數。例如:

salary DECIMAL(5,2)
複製代碼

在本例中,5表示精度,2表示刻度。精度表示爲值存儲的有效位數,小數位數表示小數點後能夠存儲的位數。
標準SQL要求decimal(5,2)可以存儲5位和2位小數的任何值,所以能夠存儲在salary列中的值範圍爲-999.99到999.99。

11.6 JSON

14 InnoDB 存儲引擎

14.6 InnoDB 磁盤數據結構

14.6.1 表格
14.6.1.1 TODO
14.6.1.2 TODO
14.6.1.3 TODO
14.6.1.4 InnoDB中的自動增量處理
InnoDB自動增量鎖模式

Insert的集中方式:

  • 「INSERT-like」 語句,全部INSERT語句,包含:INSERT, INSERT ... SELECT, REPLACE, REPLACE ... SELECT, and LOAD DATA. Includes 「simple-inserts」, 「bulk-inserts」, and 「mixed-mode」 .
  • Simple inserts 可肯定插入行數數量的,插入單行或多行,包含 INSERT and REPLACE,但不包含INSERT ... ON DUPLICATE KEY UPDATE.
  • Bulk inserts 不肯定插入行數的批量添加。包含INSERT ... SELECT, REPLACE ... SELECT, LOAD DATA語句。
  • Mixed-mode inserts 批量插入中有部分是自增,有部分是指定的,好比:
    INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');
    複製代碼
    另外也包含INSERT ... ON DUPLICATE KEY UPDATE,由於在更新階段可能會使用或不使用自動增量列的分配值。

(之因此先列出上面4中Insert方式,是由於不一樣鎖模式對不一樣Insert方式影響不同s)

參數innodb_autoinc_lock_mode設置自動增量鎖模式,0:傳統;1:連續;2:交錯。

  • innodb_autoinc_lock_mode = 0 (「traditional」 lock mode)
    針對上面4中Insert方式,都是基於表級別的AUTO-INC鎖,語句執行完就釋放鎖,不用等事務完成時才釋放鎖。但鎖表性能相對較差,好處是分配的ID連續,確保以可預測和可重複的順序爲給定的插入語句序列分配自動增量值,並確保由任何給定語句分配的自動增量值連續的。

    基於語句的複製的狀況下,這意味着在從屬服務器上覆制SQL語句時,自動遞增列的值與主服務器上的值相同。多個insert語句的執行結果是肯定性的,從系統複製與主系統相同的數據。若是多個insert語句生成的自動增量值是交錯的,那麼兩個併發insert語句的結果將是不肯定的,而且不能使用基於語句的複製可靠地傳播到從屬服務器。

  • innodb_autoinc_lock_mode = 1 (「consecutive」 lock mode)
    這是默認鎖定模式。
    對於「bulk inserts」,使用表級別的AUTO-INC鎖,一次只能執行一個保存auto-inc鎖的語句。

    對於「Simple inserts」,使用互斥量(一個輕量級鎖mutex),分配過程當中持有鎖並分配預先須要的數量,分配後釋放而不用等到整條語句執行完成,這有助於提升性能。若是另外一個事務持有auto-inc鎖,「簡單插入」將等待auto-inc鎖。

    這種鎖定模式確保,在不預先知道行數的INSERT語句(以及在語句進行時分配自動遞增數的狀況下)的狀況下,由任何「insert like」語句分配的全部自動遞增值都是連續的,能夠保證基於語句的主從複製是安全的。

    簡單地說,這種鎖定模式顯著提升了可伸縮性,同時能夠安全地用於基於語句的複製。此外,與「傳統」鎖模式同樣,由任何給定語句分配的自動增量數是連續的。對於任何使用自動增量的語句,與「傳統」模式相比,語義沒有任何變化,但有一個重要的例外。

    「mixed-mode inserts」是例外狀況。用戶爲多行「簡單插入」中的某些(而不是所有)行的自動增量列提供顯式值。對於此類插入,InnoDB分配的自動增量值比要插入的行數更多。可是,自動分配的全部值都是連續生成(所以高於)最近執行的前一條語句生成的自動增量值。「超額」數字丟失。

  • innodb_autoinc_lock_mode = 2 (「interleaved」 lock mode)
    在這種鎖模式下,不使用表級auto-inc鎖而是都是要信號量,多個語句能夠同時執行。這是最快和最可擴展的鎖模式,但在使用基於語句的複製或恢復方案時,若是從二進制日誌重放SQL語句,則不安全。

    在這種鎖定模式下,自動增量值保證在全部併發執行的「insert-like」語句中都是惟一的且單調地遞增的。可是,因爲多個語句能夠同時生成數字(也就是說,數字的分配是跨語句交錯的),所以爲任何給定語句插入的行生成的值可能不是連續的。

    若是惟一執行的語句是「簡單插入」,其中要插入的行數是提早知道的,那麼爲單個語句生成的數字中沒有間隙,除了「混合模式插入」。可是,當執行「大容量插入」時,任何給定語句分配的自動增量值中可能存在間隙。

14.6.1.5 TODO
14.6.1.6 TODO
14.6.2 索引
14.6.2.1 彙集索引與輔助索引

每一個innodb表都有一個稱爲彙集索引的特殊索引,用於按索引大小順序存儲行的數據。

  • 若是有主鍵,則爲彙集索引
  • 若是沒有主鍵,找第一個UNIQUE索引列做爲彙集索引
  • 若是也沒有UNIQUE索引,則使用隱藏的ROW_ID列爲彙集索引

14.7 Innodb 鎖與事務模型

14.7.1 鎖
  • Shared and Exclusive Locks
  • Intention Locks
  • Record Locks
  • Gap Locks
  • Next-Key Locks
  • Insert Intention Locks
  • AUTO-INC Locks
  • Predicate Locks for Spatial Indexes
Shared and Exclusive Locks (共享鎖與排他鎖)

Innodb實現了標準的行鎖,共享鎖(S)與排他鎖(X)

  • 共享鎖(S)容許持有鎖的事務讀取行。
  • 排他鎖(X)容許持有鎖的事務更新或刪除行。

若是事務T1在R行上持有共享鎖,那麼來自某些不一樣事務T2的請求對R行進行以下處理:

  • 讀請求:t2能夠當即獲取到S鎖。結果,T1和T2都在R上保持S鎖。
  • 寫請求:t2不能獲取到X鎖。

若是事務T1在R行上持有獨佔(X)鎖,則不能當即授予來自某個不一樣事務T2的請求R上任何一種類型的鎖的權限。相反,事務t2必須等待事務t1釋放對行r的鎖。

Intention Locks (意向鎖)

InnoDB 支持粒度鎖即容許行鎖與表鎖共存。例如LOCK TABLES ... WRITE語句在指定的表上設置表級別的獨佔鎖。爲了實現多粒度鎖,InnoDB使用intention locks。Intention locks是表級別的鎖,指示稍後須要對錶中的行使用哪一種類型的鎖(X或者S),有2種意向鎖:

  • intention shared lock (IS)表示事務打算在指定行上設置共享鎖。
  • intention exclusive lock (IX)表示事務打算在指定的行上設置獨佔鎖。
相關文章
相關標籤/搜索