淺析 MySQL 存儲引擎序列屬性

2020-09-17 數據和雲智能

一、MySQL序列概述

為了達到標識的目的,許多應用程式需要生成唯一編號,比如:商品編號、交易流水號等。MySQL資料庫同樣能夠支持這樣的需求場景,AUTO_INCREMENT就是為MySQL實現序列的方式,它會自動生成序列編號。但是它的使用是有要求的,比如:

  • 每個表只能有一個列具備AUTO_INCREMENT屬性,並且為整數型
  • AUTO_INCREMENT列不能包含NULL值(MySQL會自動設置為NOT NULL)
  • AUTO_INCREMENT列上必選要有索引,常見為primary key和unique index

二、MyISAM存儲引擎

MyISAM存儲引擎是支持AUTO_INCREMENT屬性的,它有如下幾個特點:

  • 單調遞增,每次序列使用完後,下一個序列將從當前最大序列開始。每次序列值都會存在數據文件中,因此當服務重啟後,依舊可以進行序列遞增。

備註:兩種情況比較特殊,第一種是使用truncate 後,序列將重新開始。第二種,如果是使用複合索引產生的多個序列,那麼這些序列將會被重用。

mysql> CREATE TABLE myisamdemo1 ( -> id int unsigned not null auto_increment, -> city varchar(10) NOT NULL, -> name varchar(30) NOT NULL, -> primary key(city,id)) ENGINE = MyISAM;Query OK, 0 rows affected (0.01 sec)mysql> INSERT INTO myisamdemo1 (city,name) VALUES (&39;,&39;);Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO myisamdemo1 (city,name) VALUES (&39;,&39;);Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO myisamdemo1 (city,name) VALUES (&39;,&39;);Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO myisamdemo1 (city,name) VALUES (&39;,&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from myisamdemo1;+----+----------+---------+| id | city | name |+----+----------+---------+| 1 | GuiYang | albert || 2 | GuiYang | tony || 1 | ChenDu | jake || 1 | ShangHai | Jessica |+----+----------+---------+4 rows in set (0.00 sec)

如果使用了這種複合索引來創建多個序列,那麼從各個序列頂端的值,也是可以進行復用的。

Query OK, 1 row affected (0.00 sec)mysql> select * from myisamdemo1;+----+----------+---------+| id | city | name |+----+----------+---------+| 1 | GuiYang | albert || 1 | ChenDu | jake || 1 | ShangHai | Jessica |+----+----------+---------+3 rows in set (0.00 sec)mysql> INSERT INTO myisamdemo1 (city,name) VALUES (&39;,&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from myisamdemo1;+----+----------+---------+| id | city | name |+----+----------+---------+| 1 | GuiYang | albert || 1 | ChenDu | jake || 1 | ShangHai | Jessica || 1 | XiAn | 368 |+----+----------+---------+4 rows in set (0.00 sec)mysql> INSERT INTO myisamdemo1 (city,name) VALUES (&39;,&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from myisamdemo1;+----+----------+---------+| id | city | name |+----+----------+---------+| 1 | GuiYang | albert || 2 | GuiYang | Kevin || 1 | ChenDu | jake || 1 | ShangHai | Jessica || 1 | XiAn | 368 |+----+----------+---------+5 rows in set (0.00 sec)

  • 默認序列從1開始,當然也可以在建表中指定起始序列號

-> id int unsigned not null auto_increment, -> nname varchar(30) NOT NULL, -> primary key(id)) ENGINE = MyISAM auto_increment=100;Query OK, 0 rows affected (0.02 sec)mysql> INSERT INTO myisamdemo (nname) VALUES (&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from myisamdemo;+-----+--------+| id | nname |+-----+--------+| 100 | Albert |+-----+--------+1 row in set (0.00 sec)mysql> INSERT INTO myisamdemo (nname) VALUES (&39;);Query OK, 1 row affected (0.01 sec)mysql> select * from myisamdemo;+-----+--------+| id | nname |+-----+--------+| 100 | Albert || 101 | tony |+-----+--------+2 rows in set (0.00 sec)

  • 可以通過alter table來修改已存在的序列號。
    可以調整下一個序列的起始值,比如:

mysql> select * from myisamdemo;+-----+--------+| id | nname |+-----+--------+| 100 | Albert || 101 | tony |+-----+--------+2 rows in set (0.00 sec)mysql> alter table myisamdemo auto_increment=200;Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0mysql> INSERT INTO myisamdemo (nname) VALUES (&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from myisamdemo;+-----+--------+| id | nname |+-----+--------+| 100 | Albert || 101 | tony || 200 | nike |+-----+--------+3 rows in set (0.00 sec)

還可以重用頂端的序列,比如當前最大的序列為202,刪除後通過指定起始值,是可以重新使用該序列。但是需要注意的是,不能在序列包含裡面,比如100至201之間。

mysql> select * from myisamdemo;+-----+--------+| id | nname |+-----+--------+| 100 | Albert || 200 | nike || 201 | jake || 202 | harry |+-----+--------+4 rows in set (0.00 sec)mysql> delete from myisamdemo where id=202;Query OK, 1 row affected (0.00 sec)mysql> select * from myisamdemo;+-----+--------+| id | nname |+-----+--------+| 100 | Albert || 200 | nike || 201 | jake |+-----+--------+3 rows in set (0.00 sec)mysql> alter table myisamdemo auto_increment=201;Query OK, 3 rows affected (0.01 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> INSERT INTO myisamdemo (nname) VALUES (&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from myisamdemo;+-----+--------+| id | nname |+-----+--------+| 100 | Albert || 200 | nike || 201 | jake || 202 | sunny |+-----+--------+4 rows in set (0.00 sec)

三、MEMORY存儲引擎

MEMORY存儲引擎同樣是支持AUTO_INCREMENT屬性的:

  • 默認序列從1開始,當然也可以在建表中指定起始序列號

mysql> CREATE TABLE memorydemo ( -> id int unsigned not null auto_increment, -> name varchar(30) NOT NULL, -> primary key(id)) ENGINE = memory auto_increment=100;Query OK, 0 rows affected (0.00 sec)mysql> INSERT INTO memorydemo (name) VALUES (&39;);Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO memorydemo (name) VALUES (&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from memorydemo;+-----+-------+| id | name |+-----+-------+| 100 | tony || 101 | Tommy |+-----+-------+2 rows in set (0.00 sec)

  • 可以通過alter table 調整調整初始序列

mysql> select * from memorydemo;+-----+-------+| id | name |+-----+-------+| 100 | tony || 101 | Tommy |+-----+-------+2 rows in set (0.00 sec)mysql> alter table memorydemo auto_increment=400;Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0mysql> mysql> INSERT INTO memorydemo (name) VALUES (&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from memorydemo;+-----+---------+| id | name |+-----+---------+| 100 | tony || 101 | Tommy || 400 | Jessica |+-----+---------+3 rows in set (0.00 sec)

  • 頂端序列被刪除後,不能被重用

+-----+---------+| id | name |+-----+---------+| 100 | tony || 101 | Tommy || 400 | Jessica |+-----+---------+3 rows in set (0.00 sec)mysql> delete from memorydemo where id=400;Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO memorydemo (name) VALUES (&39;);Query OK, 1 row affected (0.00 sec)mysql> select * from memorydemo;+-----+-------+| id | name |+-----+-------+| 100 | tony || 101 | Tommy || 401 | marry |+-----+-------+3 rows in set (0.00 sec)

  • 不能使用複合索引生成多個序列,因為有且只能定義一個主鍵列

四、INNODB存儲引擎

...

✨ 接下來內容請訪問原文(https://www.modb.pro/db/29406?YYF)進行查看~

更多資料庫相關內容,可訪問墨天輪(https://www.modb.pro/?YYF)進行瀏覽。


相關焦點

  • 刪除行對MySQL序列有什麼影響?
    一、MySQL序列概述為了達到標識的目的,許多應用程式需要生成唯一編號,比如:商品編號、交易流水號等。MySQL資料庫同樣能夠支持這樣的需求場景,AUTO_INCREMENT就是為MySQL實現序列的方式,它會自動生成序列編號。
  • MySQL不同存儲引擎的數據備份與恢復
    在之前的幾篇文章中,我們以MySQL為例對數據備份進行了粗略的解讀,本文我們依然以MySQL為例,講講面對不同的存儲引擎如何做數據備份與恢復。  為了應對不同的數據處理,MySQL提供了十幾種不同的存儲引擎,不過,我們沒有必要一一去了解,因為熟悉使用MySQL的人都知道,比較常用的存儲引擎有兩個,分別是MyISAM和InnoDB。
  • 淺析mysql存儲過程
    很多同學自然就想到了set+prepare的預處理語句,但是這裡規定了不能夠同時輸入set和prepaere,又被堵死了,但是mysql還有一個可以讓語句分開執行且達到等同於一起執行的效果,這裡介紹一下正解,mysql的存儲過程。
  • 溫故而知新:MySQL存儲引擎入門介紹
    存儲引擎常用命令查看MySQL提供的所有存儲引擎mysql> show engines;5.7版本所有的存儲引擎中只有 InnoDB 是事務性存儲引擎,也就是說只有 InnoDB 支持事務。查看MySQL當前默認的存儲引擎我們也可以通過下面的命令查看默認的存儲引擎。
  • 淺析雲存儲的種類劃分及屬性特徵
    淺析雲存儲的種類劃分及屬性特徵 淺析雲存儲的種類劃分及屬性特徵 2018-09-12 14:56:45  來源:威騰電子雲存儲也是有不同的種類,應用在不同的雲服務環境。從數據的存儲和訪問的方式來區分,雲存儲包括數據塊級雲存儲、文件級雲存儲和對象級雲存儲。 關鍵詞: 雲存儲   符合雲存儲特徵的存儲設備,稱為雲存儲。有句俗話,一鞋不能適千足。
  • MySQL底層存儲結構
    從上面我們可以看出innodb存儲引擎的表空間和myisam存儲引擎的表空間,有一點不一樣:innodb存儲引擎的表空間對應的數據文件和索引是放在一個文件中的,而myisam存儲引擎的表對應的數據文件和索引文件是兩個分開的數據文件,這也是innodb表又稱為IOT,索引組織表的一個原因,它的數據和索引是存放在一個數據文件中的。
  • MySQL常用存儲引擎特點及適用場景全解析,你想要的都在這裡
    下面就以存儲引擎角度來分析Mysql對不同應用場景的支持。在創建表時,可以顯示的指定資料庫表的存儲引擎:ENGINE=MyISAMCREATE TABE TEST(Id long not null ,name varchar(20))ENGINE=MyISAM 查看當前資料庫支持的存儲引擎:mysql
  • MySQL授權管理與結構分層
    解析優化器(代價)執行器查詢緩存日誌記錄二進位日誌存儲引擎層從磁碟讀取數據頁返回給SQL層資料庫結構物理結構資料庫----->目錄表,對於MyISAM引擎和InnoDB有不同的結構MyISAM結構FRM存儲列信息MYD存儲數據MYI存儲索引InnoDB結構
  • MySQL中的存儲引擎是什麼意思?
    導讀:本篇文章是想聊聊MySQL為什麼要出現存儲引擎這項技術。「存儲引擎」從字面理解,「存儲」的意思的存儲數據。「引擎」一詞來源於發動機,它是發動機中的核心部分。在軟體工程領域,相似的稱呼有「遊戲引擎」、「搜尋引擎」,它們都是相應程序或系統的核心組件。
  • mysql表管理、索引、序列、約束
    指定主鍵的時候是默認創建索引的,這個知識點了解即可;1、創建索引;create index 索引名稱 on 表名(欄位名);或者alter table 表名 add index 索引名稱(列名)2、刪除索引;drop index 索引名稱 on 表名;五、序列;序列是自動增長的整數,前面我們講過一個自動增長的列
  • MySql事務淺析
    1.事務是MySql資料庫和NoSql資料庫的重要區別之一2.便於管理的關聯關係也是MySql對比NoSql的重要優勢3.事務是查詢和更新資料庫的一個查詢單元,這個單元包含多個sql語句4.資料庫的邏輯結構,連接器,分析器,優化器,緩存,存儲引擎5.MySql支持事務的存儲引擎有InnoDB,不支持的有MyIsam,Memory
  • MySQL資料庫存儲varchar時多大長度會出現行遷移?
    但是一直很困惑, mysql的默認安裝的page 是 16kb 大小, 理論上一個頁不可能超過 16000 個bytes 長度, 很多文檔資料裡面都有 說法是 text和blob的類型都會出現行遷移, 但是對varchar 都沒有明確的說法, 今天趁著周六下了一個電子書, 將姜承堯老師的<MySQL技術內幕InnoDB存儲引擎第2版> 翻了 100多頁 也沒翻到具體的資料, 沒辦法只能夠進行嘗試
  • 《MySQL 入門教程》第 04 篇 管理表
    MySQL 中的表與其他資料庫的最大區別在於它們可以使用不同的存儲引擎(Storage Engine)。存儲引擎是 MySQL 中用於管理、訪問和修改物理數據的組件,不同的存儲引擎提供了不同的功能和特性。從 MySQL 5.5 開始,默認使用 InnoDB 存儲引擎;支持事務處理(ACID)、行級鎖定、故障恢復、多版本並發控制(MVCC)以及外鍵約束。大多數情況下,推薦使用默認的 InnoDB 存儲引擎。
  • 網易5位大牛推出MySQL內核InnoDB存儲引擎360筆記
    第一章概覽:本章首先介紹了MySQL資料庫以及InnoDB存儲引擎的歷史,之後介紹了InnoDB存儲引擎的源碼結構與代碼風格,最後推薦了閱讀InnoDB存儲引擎源碼的次序。InnoDB 存儲引擎正是通過這些數據結構才能完成正確並發控制的。
  • MySQL資料庫及應用
    關鍵字(主碼或主鍵)答案: D4 單選 在同一個資料庫中某個關係R1中的屬性或屬性組若在另一個關係R2中作為關鍵字(主碼)使用,則該屬性或屬性組為R1的___________。A. 列B.MEMORY存儲引擎的所有數據都存儲在內存中,數據的處理速度快但安全性不高C. MyISAM存儲引擎提供了高速的存儲與檢索和全文探索能力,它並不支持事務處理應用程式D.
  • MySql基礎,MySql視圖&索引&存儲過程&觸發器
    MySQL索引類型詳解索引的類型和存儲引擎有關,每種存儲引擎所支持的索引類型不一定完全相同。MySQL 索引可以從存儲方式、邏輯角度和實際使用的角度來進行分類。存儲引擎不能使用索引中範圍條件右邊的列。哈希索引哈希(Hash)一般翻譯為「散列」,也有直接音譯成「哈希」的,就是把任意長度的輸入(又叫作預映射,pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。
  • MySql面試題及答案大全
    資料庫三大範式第一範式:資料庫表中的欄位都是單一屬性的,不可再分(保持數據的原子性);第二範式:第二範式必須符合第一範式,非主屬性必須完全依賴於主鍵。=或<>操作符,否則將引擎放棄使用索引而進行全表掃描;說一說你能想到的表結構優化,至少五種永遠為每張表設置一個ID (所有建表的時候不設置主鍵的程序猿都應該被辭退);選擇正確的存儲引擎 ;使用可存下數據的最小的數據類型,整型 < date,time < char,varchar < blob;使用簡單的數據類型,整型比字符處理開銷更小,因為字符串的比較更複雜。
  • 索引在MySQL中叫「鍵」,存儲引擎用快速找記錄一種數據結構
    索引在MySQL中也叫做「鍵」,是存儲引擎用於快速找到記錄的一種數據結構。索引對於良好的性能非常關鍵,尤其是當表中的數據量越來越大時,索引對於性能的影響愈發重要。索引優化應該是對查詢性能優化最有效的手段了。索引能夠輕易將查詢性能提高好幾個數量級。索引相當於字典的音序表,如果要查某個字,如果不使用音序表,則需要從幾百頁中逐頁去查。
  • 好程式設計師大數據培訓分享mysql數據類型
    好程式設計師大數據培訓分享mysql數據類型,數據類型介紹• 數據類型設置• 列屬性• 數據類型的字符集用法• 選擇適當的數據類型2、數據類型介紹使用數值數據類型時的注意事項:  數據類型所表示的值的範圍  列值所需的空間量  列精度和範圍(浮點數和定點數)  • 數值數據類型的類:  整數:整數  浮點數:小數  定點數:精確值數值  BIT:位欄位值  4、字符串數據類型  • 表示給定字符集中的一個字母數字字符序列
  • mysql存儲引擎InnoDB詳解,從底層看清InnoDB數據結構
    InnoDB一個支持事務安全的存儲引擎,同時也是mysql的默認存儲引擎。本文主要從數據結構的角度,詳細介紹InnoDB行記錄格式和數據頁的實現原理,從底層看清InnoDB存儲引擎。可以不嚴謹的認為,mysql一行記錄佔用的存儲空間不能超過65535個字節。