MySQL的InnoDB引擎強烈建議使用自增主鍵的原因
1)InnoDB使用聚集索引,資料記錄本身被存於主索引的葉子節點上,這就要求同一個葉子節點內的各條資料記錄按主鍵順序存放,因此每當一條新的記錄插入時,MySQL會根據其主鍵將其插入適當的節點和位置,如果頁面達到裝載因子,則開闢一個新的頁(節點)如果表使用自增主鍵,那麼每次插入新的記錄時,記錄就會順序新增到當前索引節點後續位置,當一頁寫滿,就會自動開闢一個新的頁。這樣就就會形成一個緊湊的索引結構,近似順序填滿,由於每次插入時也不需要移動所有資料,因此效率很高,也不會增加很多額外的開銷維護索引如果使用非自增主鍵,由於每次插入主鍵的值近乎於隨機,因此每次新紀錄都要被插到現有索引頁的中間某個位置,此時MySQL不得不為了將新紀錄插到合適位置而移動資料,甚至目標頁面可能已經被寫到磁碟而從快取中清除,這增加了很多額外開銷,同時頻繁的移動,分頁造成了大量的碎片,得到不夠緊湊的索引結構,後續不得不通過OPTIMIZE TABLE來重建並優化填充頁面。
2)由於MySQL從磁碟讀取資料時一塊一塊來讀取的,同時,根據區域性性原理,MySQL引擎會選擇預讀一部分和你當前讀資料所在記憶體相鄰的資料塊,這個時候這些相鄰資料塊的資料已經存在於記憶體中。由於資料庫大部分是查詢操作,這個時候,如果主鍵是自增的話,資料儲存都是緊湊地儲存在一起的,那麼對於區域性性原理利用和避免過多地I/O操作都有著巨大的促進作用
相關文章
- MySQL不建議用UUID做innodb主鍵的幾條原因MySqlUI
- MySQL 中的自增主鍵MySql
- 【mycat】mycat中配合mysql自增主鍵的使用MySql
- MySQL新增自增主鍵的坑MySql
- Mysql關於自增主鍵,自增主鍵優化總結MySql優化
- MySQL 主鍵自增也有坑?MySql
- 深入瞭解MySQL中的自增主鍵MySql
- MYSQL INNODB主鍵使用varchar和int的區別MySql
- MySQL 主鍵自增 Auto Increment用法MySqlREM
- 【Python】國內的pythoner強烈建議使用豆瓣的pypi源Python
- MyBatis的Insert操作自增主鍵的實現,Mysql協議與JDBC實現MyBatisMySql協議JDBC
- 強烈建議出下一個版本
- 必備連結【強烈建議留存】
- MySQL 8 新特性之自增主鍵的持久化MySql持久化
- MySQL8自增主鍵變化MySql
- MySQL自增主鍵跳號問題MySql
- MySQL 資料庫自增主鍵生成的優缺點MySql資料庫
- postgresql自增主鍵SQL
- MySQL 缺少主鍵的表的效能下降的原因MySql
- Laravel 中使用 Redis 生成自增主鍵LaravelRedis
- innodb引擎對自增欄位(auto_increment)的處理REM
- java面試一日一題:mysql中的自增主鍵Java面試MySql
- 向Mysql主鍵自增長表中新增資料並返回主鍵MySql
- mybatis入門程式:向資料庫中新增使用者&&自增主鍵和非自增主鍵的返回MyBatis資料庫
- PostgreSQL 建立主鍵自增表的 DDLSQL
- MySQL InnoDB行鎖優化建議MySql優化
- 強烈建議社群文件選單進行改進!
- mysql建表必須使用主鍵嗎MySql
- Mysql innodb引擎和myisam引擎使用索引區別MySql索引
- PostgreSQL建立自增主鍵的兩種方法SQL
- 可能是東半球最好的 Curl 學習指南,強烈建議收藏!
- Oracle 建立主鍵自增表Oracle
- [需求建議]強烈希望OneThink開發不要中斷
- 強烈建議《Java實用系統開發指南》再版Java
- 【Mysql】InnoDB 引擎中的頁目錄MySql
- select @@Identity 返回自增主鍵的值IDE
- Mysql innodb引擎(二)鎖MySql
- MySQL InnoDB儲存引擎MySql儲存引擎