91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

建表為什么還設置個自增 id

發布時間:2021-10-22 15:59:07 來源:億速云 閱讀:228 作者:iii 欄目:數據庫

這篇文章主要講解了“建表為什么還設置個自增 id”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“建表為什么還設置個自增 id”吧!

1.建表規約

建表為什么還設置個自增 id

在工作中,創建表的時候,DBA 也會審核一下建表 SQL,檢查是否符合規范以及常用字段是否設置索引。

CREATE TABLE `xxxx` (   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',   `create_time` datetime(3) NOT NULL DEFAULT current_timestamp(3) COMMENT '創建時間',   `update_time` datetime(3) NOT NULL DEFAULT current_timestamp(3) ON UPDATE current_timestamp(3) COMMENT '更新時間',   PRIMARY KEY (`id`) USING BTREE,   KEY `idx_create_time` (`create_time`) USING BTREE,   KEY `idx_update_time` (`update_time`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='表注釋';

所以在我使用的過程中,流水號都是單獨設置了一個字段,比如叫 trans_no,但是這次就遇到了疑問:trans_no 既然是唯一的,那為什么不直接用  trans_no 當做 id 呢?

下面開始通過查閱相關資料,一步一步的了解是為什么?

2.主鍵

什么是主鍵?

建表為什么還設置個自增 id

MySQL primary key

這段定義咱們主要關注最后一句:

" When choosing primary key values, consider using arbitrary values (a  synthetic key) rather than relying on values derived from some other source (a  natural key). "

意思是創建主鍵的時候盡量使用 MySQL 自增主鍵而不是使用業務生成的值當做主鍵。

主鍵的特征

建表為什么還設置個自增 id

簡而言之:

非空、唯一、少更改或不更改 。

如何添加主鍵

建表為什么還設置個自增 id

可以在 create 創建表的時候指定,也可以使用 alter 語句后面添加主鍵,不過官方建議在創建表時就指定。

為什么要添加主鍵

  1. 主鍵可以唯一標識這一行數據,從而保證在刪除更新操作時,只是操作這一行數據。

  2. 索引需要,每個 InnoDB 表又有一個特殊的索引,即聚簇索引,用來存儲行數據。通常,聚簇索引和主鍵同義。

  • 聲明主鍵,InnoDB 會將主鍵作為聚簇索引。

  • 未聲明時,會在 UNIQUE 所有鍵列所在位置找到第一個索引,NOT NULL 并將其作為聚簇索引

  • 未聲明且找不到合適的 UNIQUE 索引,則內部生成一個隱藏的聚簇索引 GEN_CLUST_INDEX,這個隱藏的行 ID 是 6  字節且單調增加。

3.索引

這里僅介紹 InnoDB 引擎,具體可以參考官方文檔,并且介紹的相對比較簡單。

索引的分類

聚簇索引:表存儲是根據主鍵列的值組織的,以加快涉及主鍵列的查詢和排序。在介紹主鍵時也對聚簇索引進行了介紹。

二級索引:也可以叫輔助索引,在輔助索引中會記錄對應的主鍵列以及輔助索引列。根據輔助索引進行搜索的時候,會先根據輔助索引獲取到對應的主鍵列,然后再根據主鍵去聚簇索引里面搜索。一般不建議主鍵很長,因為主鍵很長輔助索引就會使用更多的空間。

" 補充:

回表:先在二級索引查詢到對應的主鍵值,然后根據主鍵再去聚簇索引里面取查詢。

索引覆蓋:二級索引記錄了主鍵列和二級索引列,如果我只查詢主鍵列的值和二級索引列的值,那就不需要回表了。 "

索引的物理結構

InnoDB 使用的 B+ 數數據結構,根據聚簇索引值(主鍵/UNQIUE/或者自己生成)構建一顆 B+  樹,葉子節點中存放行記錄數據,所以每個葉子節點也可以叫數據頁。每個數據頁大小默認為 16k,支持自定義。

建表為什么還設置個自增 id

數據的插入

當數據插入時,InnoDB 會使頁面 1/16 空閑,以備將來插入和更新索引記錄。

  1. 順序插入(升序或降序):會將索引頁剩余的大約 15/16 裝滿

  2. 隨機插入:只會使用容量的 1/2 到 15/16

在隨機插入中,會頻繁的移動、分頁,從而造成大量的碎片,并且使索引樹不夠緊湊。而使用順序插入的方式,則數據比較緊湊,有更高的空間利用率。

4.總結

Q&A

Q: 什么是回表和索引覆蓋?

A:

回表:先在二級索引查詢到對應的主鍵值,然后根據主鍵再去聚簇索引里面取查詢。

索引覆蓋:二級索引記錄了主鍵列和二級索引列,如果我只查詢主鍵列的值和二級索引列的值,那就不需要回表了。

Q: 為什么要設置自增主鍵 id ?

A:

可以唯一標識一行數據,在 InnoDB 構建索引樹的時候會使用主鍵。

自增 id 是順序的,可以保證索引樹上的數據比較緊湊,有更高的空間利用率以及減少數據頁的分裂合并等操作,提高效率。

一般使用手機號、身份證號作為主鍵等并不能保證順序性。

流水號一般相對較長,比如 28 位,32 位等,過長的話會二級索引占用空間較多。同時為了業務需求,流水號具有一定的隨機性。

感謝各位的閱讀,以上就是“建表為什么還設置個自增 id”的內容了,經過本文的學習后,相信大家對建表為什么還設置個自增 id這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南雄市| 东港市| 靖宇县| 礼泉县| 兴安盟| 峨眉山市| 桐梓县| 宝山区| 永清县| 商南县| 栾川县| 时尚| 竹山县| 安多县| 睢宁县| 南溪县| 叶城县| 滨海县| 饶平县| 腾冲县| 西安市| 永登县| 黑龙江省| 五莲县| 讷河市| 苏尼特左旗| 锡林浩特市| 秭归县| 长宁区| 遵化市| 元朗区| 丹江口市| 繁昌县| 鄂托克旗| 加查县| 弥勒县| 潢川县| 报价| 宁陵县| 定结县| 桦甸市|