一、什麼是索引?
索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b-樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,mysql無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查詢記錄至少要比順序掃描記錄快100倍。
二、索引的型別
mysql提供多種索引型別供選擇:
普通索引
這是最基本的索引型別,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式建立:
建立索引,例如create index 《索引的名字》 on tablename (列的列表);
修改表,例如alter table tablename add index [索引的名字] (列的列表);
建立表的時候指定索引,例如create table tablename ( [...], index [索引的名字] (列的列表) );
唯一性索引
這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。唯一性索引可以用以下幾種方式建立:
建立索引,例如create unique index 《索引的名字》 on tablename (列的列表);
修改表,例如alter table tablename add unique [索引的名字] (列的列表);
建立表的時候指定索引,例如create table tablename ( [...], unique [索引的名字] (列的列表) );
主鍵主鍵是一種唯一性索引,但它必須指定為“primary key”。如果你曾經用過auto_increment型別的列,你可能已經熟悉主鍵之類的概念了。主鍵一般在建立表的時候指定,例如“create table tablename ( [...], primary key (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“alter table tablename add primary key (列的列表); ”。每個表只能有一個主鍵。
索引的缺點
到目前為止,我們討論的都是索引的優點。事實上,索引也是有缺點的。
第二,對於需要寫入資料的操作,比如delete、update以及insert操作,索引會降低它們的速度。這是因為mysql不僅要把改動資料寫入資料檔案,而且它還要把這些改動寫入索引檔案。
索引與主鍵的主要區別有:
主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
主鍵建立後一定包含一個唯一性索引,唯一性索引並不一定就是主鍵。
唯一性索引列允許空值,而主鍵列不允許為空值。
主鍵列在建立時,已經預設為空值 + 唯一索引了。
主鍵可以被其他表引用為外來鍵,而唯一索引不能。
一個表最多隻能建立一個主鍵,但可以建立多個唯一索引。
主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。
在 rbo 模式下,主鍵的執行計劃優先順序要高於唯一索引。 兩者可以提高查詢的速度。
-- 建立一張僅包含主鍵和唯一索引的表
create table test
(primarykey varchar2(20),
uniquekey varchar2(20)
-- 分別建立主鍵和唯一索引,語法不同
alter table test add constraint test_primarykey primary key (primarykey);
create unique index test_uniquekey on test (uniquekey);
-- 在 user_indexes 中可以看到兩個索引名稱
select table_name,table_type,index_name,index_type,uniqueness
from user_indexes
where table_name='test';
-- 在 user_ind_columns 中可以看到兩個索引欄位名稱
select table_name,index_name,column_name,column_position
from user_ind_columns
where table_name='test';
-- 在 user_constraints 僅可以看到主鍵約束名稱
select table_name,constraint_name,constraint_type
from user_constraints
where table_name='test';
-- 在 user_cons_columns 僅可以看到主鍵約束欄位名稱
select table_name,constraint_name,column_name,position
from user_cons_columns
where constraint_name in (select constraint_name
from user_constraints
where table_name='test');
-- 為唯一索引增加一個非空約束
alter table test modify uniquekey not null;
-- 在 user_constraints 僅可以看到主鍵約束名稱和非空約束名稱
select table_name,constraint_name,constraint_type
from user_constraints
where table_name='test'
-- 在 user_cons_columns 僅可以看到主鍵約束欄位名稱和非空約束欄位名稱
select table_name,constraint_name,column_name,position
from user_cons_columns
where constraint_name in (select constraint_name
from user_constraints
where table_name='test')
Mysql索引詳解
1為什麼使用索引?什麼是索引 資料庫索引其實與書本中的目錄非常相似,主要是為了提高從表中檢索資料的速度。由於資料儲存子啊資料庫表中,所以索引是建立在資料庫表物件上的,由表中的一個欄位或多個欄位生成的鍵組成,這些鍵存數在資料結構b tree或hash表中。通過mysql可以快速有效的而查詢與鍵值相關的...
mysql索引詳解
mysql常見索引有 普通索引 主鍵索引 唯一索引 全文索引 組合索引 1.primarykey 主鍵索引 alter table table name add primary key column 2.unique 唯一索引 alter table table name addunique ind...
MySQL索引詳解
索引是儲存引擎用於快速找到記錄的一種資料結構,索引類似一本書的目錄,我們根據目錄可以快速的查詢到我們感興趣的內容。索引就是儲存引擎的目錄,如果沒有索引儲存引擎必須遍歷整個資料庫表來查詢符合條件的記錄,索引的建立和優化應該是提升查詢效能最有效的手段了。索引是在mysql的儲存引擎層中實現的,而不是在服...