MySQL技術內幕 16 索引組織表

2021-08-28 22:06:22 字數 1741 閱讀 9522

在 innodb儲存引擎中,表都是根據主鍵順序組織存放的,這種儲存方式的表稱為索引組織表(index orgnaized table)。在 innodb儲存引擎表中,每張表都有個主鍵(primary key),如果在建立表時沒有顯式地定義主鍵,則 innodb儲存引擎會按如下方式選擇或建立主鍵:

當表中有多個非空唯一索引時, innodb儲存引擎將選擇建表時第乙個定義的非空唯一索引為主鍵。這裡需要非常注意的是,主鍵的選擇根據的是定義索引的順序,而不是建表時列的順序。看下面的例子:

mysql> create table z( a int not null, b int null, c int not null, d int not null, unique key(b), unique key(d), unique key(c) );

query ok, 0 rows affected (0.03 sec)

mysql> insert into z select 1,2,3,4;

query ok, 1 row affected (0.00 sec)

records: 1 duplicates: 0 warnings: 0

mysql> insert into z select 5,6,7,8;

query ok, 1 row affected (0.01 sec)

records: 1 duplicates: 0 warnings: 0

上述示例建立了一張表z,有a、b、c、d四個列。b、c、d三列上都有唯一索引,不同的是b列允許null值。由於沒有顯式地定義主鍵,因此會選擇非空的唯一索引,可以通過下面的sql語句判斷表的主鍵值:

mysql> select a,b,c,d,_rowid from z;

+---+------+---+---+--------+

| a | b | c | d | _rowid |

+---+------+---+---+--------+

| 1 | 2 | 3 | 4 | 4 |

| 5 | 6 | 7 | 8 | 8 |

+---+------+---+---+--------+

2 rows in set (0.01 sec)

_rowid可以顯示表的主鍵,因此通過上述查詢可以找到表z的主鍵。此外,雖然c,d列都是非空唯一索引,都可以作為主鍵的候選,但是在定義的過程中,由於d列首先定義為唯一索引,故 innodb儲存引擎將其視為主鍵。

另外需要注意的是, _rowid只能用於檢視單個列為主鍵的情況,對於多列組成的主鍵就顯得無能為力了,如:

mysql> create table a(

-> a int,

-> b int,

-> primary key(a, b)

-> )engine=innodb;

error 1050 (42s01): table 'a' already exists

mysql> insert into a select 1,1;

query ok, 1 row affected (0.00 sec)

records: 1 duplicates: 0 warnings: 0

mysql> select a, _rowid from a;

error 1054 (42s22): unknown column '_rowid' in 'field list'

MySQL技術內幕 五 索引與演算法

一 索引概述 innodb支援兩種常見索引,一種是b 樹索引一種是雜湊索引。雜湊索引是自適應的,引1擎會根據表的使用情況自動為表生成雜湊索引,不能人為干預是否在一張表裡生成雜湊索引 b 樹索引就是傳統意義上的索引,這是關係型資料庫中最常用 有效的索引 b 樹索引的構造類似於二叉樹,根據鍵值快速找到資...

MySQL技術內幕

innodb儲存引擎是事物安全的儲存引擎。innodb儲存引擎有多個記憶體塊,這些記憶體塊組成乙個很大的記憶體池,負責如下的工作 後台執行緒 innodb儲存引擎是多執行緒模型,因此他有多個不同的後台執行緒,負責處理不同的任務。記憶體日誌檔案 記錄mysql對某種條件做出響應時的檔案,如錯誤日誌檔案...

MySQL技術內幕(一)

1.mysql是一種可移植的資料庫,可在多種平台下使用,如linux,solaris,freebsd,mac,windows 2.資料庫和資料庫例項的區別 資料庫是指物理上儲存的檔案的集合 資料庫例項是由後台的執行緒 程序和共享記憶體區組成,操縱資料庫檔案。3.mysql區別於其他資料庫的最重要的特...