SQL 索引(栗子版)

2021-10-09 03:07:39 字數 3643 閱讀 6397

sql索引在資料庫優化中占有乙個非常大的比例, 乙個好的索引的設計,可以讓你的效率提高幾十甚至幾百倍。

sql索引有兩種,聚集索引和非聚集索引。

先不說概念,舉個栗子:

字典例:

字典前面的目錄,可以按照拼音和部首去查詢,我們想查詢乙個字,只需要根據拼音或者部首去查詢,就可以快速的定位到這個漢字了,這個就是索引的好處,拼音查詢法就是聚集索引,部首查詢就是乙個非聚集索引.

概念:聚集索引儲存記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理儲存並不連續。就像字段,聚集索引是連續的,a後面肯定是b,非聚集索引就不連續了。聚集索引乙個表只能有乙個,而非聚集索引乙個表可以存在多個。

無索引的表,查詢時,是按照順序存續的方法掃瞄每個記錄來查詢符合條件的記錄,這樣效率十分低下。

舉個栗子:

如果我們將字典的漢字隨即打亂,沒有前面的按照拼音或者部首查詢,那麼我們想找乙個字,按照順序的方式去一頁頁的找,這樣效率有多底,大家可以想象。

聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致。

栗子回來看一下:

如果按照拼音查詢,那麼都是從a-z的,是具有連續性的,a後面就是b,b後面就是c, 聚集索引就是這樣的,他是和表的物理排列順序是一樣的,例如有id為聚集索引,那麼1後面肯定是2,2後面肯定是3,所以說這樣的搜尋順序的就是聚集索引。非聚集索引就和按照部首查詢是一樣是,可能按照偏房查詢的時候,根據偏旁『弓』字旁,索引出兩個漢字,張和弘,但是這兩個其實乙個在9頁,乙個在99頁。(假設)

他們的索引順序和資料庫表的排列順序是不一樣的,這個樣的就是非聚集索引。

聚集索引就是在資料庫被開闢乙個物理空間存放他的排列的值,例如1-100,所以當插入資料時,他會重新排列整個整個物理空間,而非聚集索引其實可以看作是乙個含有聚集索引的表,他只僅包含原表中非聚集索引的列和指向實際物理表的指標。

1)定義主鍵的資料列一定要建立索引。

2) 定義有外來鍵的資料列一定要建立索引。

3) 對於經常查詢的資料列最好建立索引。

4) 對於需要在指定範圍內的快速或頻繁查詢的資料列;

5) 經常用在where子句中的資料列。

6) 經常出現在關鍵字order by、group by、distinct後面的字段,建立索引。如果建立的是復合索引,索引的字段順序要和這些關鍵字後面的字段順序一致,否則索引不會被使用。

7) 對於那些查詢中很少涉及的列,重複值比較多的列不要建立索引。

8) 對於定義為text、image和bit的資料型別的列不要建立索引。

9) 對於經常訪問的列避免建立索引。

9) 限制表上的索引數目。對乙個存在大量更新操作的表,所建索引的數目一般不要超過3個,最多不要超過5個。索引雖說提高了訪問速度,但太多索引會影響資料的更新操作。

10) 對復合索引,按照欄位在查詢條件**現的頻度建立索引。在復合索引中,記錄首先按照第乙個字段排序。對於在第乙個欄位上取值相同的記錄,系統再按照第二個欄位的取值排序,以此類推。因此只有復合索引的第乙個字段出現在查詢條件中,該索引才可能被使用,因此將應用頻度高的字段,放置在復合索引的前面,會使系統最大可能地使用此索引,發揮索引的作用。

(補充『

單一索引:

單一索引是指索引列為一列的情況,即新建索引的語句只實施在一列上; 

復合索引:

復合索引也叫組合索引;

使用者可以在多個列上建立索引,這種索引叫做復合索引(組合索引)。

復合索引在資料庫操作期間所需的開銷更小,可以代替多個單一索引;    

同時有兩個概念叫做窄索引和寬索引,窄索引是指索引列為1-2列的索引,寬索引也就是索引列超過2列的索引;     

設計索引的乙個重要原則就是能用窄索引不用寬索引,因為窄索引往往比組合索引更有效;

在執行create table語句時可以建立索引,也可以單獨用create index或alter table來為表增加索引。

1.alter table

alter table用來建立普通索引、unique索引或primary key索引。

alter table table_name add index index_name (column_list)

alter table table_name add unique (column_list)

alter table table_name add primary key (column_list)

其中table_name是要增加索引的表名,column_list指出對哪些列進行索引,多列時各列之間用逗號分隔。索引名index_name可選,預設時,mysql將根據第乙個索引列賦乙個名稱。另外,alter table允許在單個語句中更改多個表,因此可以在同時建立多個索引。

2.create index

create index可對表增加普通索引或unique索引。 

create index index_name on table_name (column_list)

create unique index index_name on table_name (column_list)

table_name、index_name和column_list具有與alter table語句中相同的含義,索引名不可選。另外,不能用create index語句建立primary key索引。

3.索引型別

在建立索引時,可以規定索引能否包含重複值。如果不包含,則索引應該建立為primary key或unique索引。對於單列惟一性索引,這保證單列不包含重複的值。對於多列惟一性索引,保證多個值的組合不重複。

primary key索引和unique索引非常類似。事實上,primary key索引僅是乙個具有名稱primary的unique索引。這表示乙個表只能包含乙個primary key,因為乙個表中不可能具有兩個同名的索引。

下面的sql語句對students表在sid上新增primary key索引。

alter table students add primary key (sid)

4.刪除索引

可利用alter table或drop index語句來刪除索引。類似於create index語句,drop index可以在alter table內部作為一條語句處理,語法如下。

drop index index_name on talbe_name

alter table table_name drop index index_name

alter table table_name drop primary key

其中,前兩條語句是等價的,刪除掉table_name中的索引index_name。

第3條語句只在刪除primary key索引時使用,因為乙個表只可能有乙個primary key索引,因此不需要指定索引名。如果沒有建立primary key索引,但表具有乙個或多個unique索引,則mysql將刪除第乙個unique索引。

如果從表中刪除了某列,則索引會受到影響。對於多列組合的索引,如果刪除其中的某列,則該列也會從索引中刪除。如果刪除組成索引的所有列,則整個索引將被刪除。

4.檢視索引

mysql> show index from tblname;

mysql> show keys from tblname;

SQL 索引 建立索引

create index 語句用於在表中建立索引。在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。您可以在表中建立索引,以便更加快速高效地查詢資料。使用者無法看到索引,它們只能被用來加速搜尋 查詢。注釋 更新乙個包含索引的表需要比更新乙個沒有索引的表更多的時間,這是由於索引本身也需要...

SQL優化(SQL 索引)

檢視表定義 show create table users 檢視表的索引 show index from users 你要獲取第乙個表的所有資訊,你說全表掃瞄快呢還是索引掃瞄快呢?所以當你查詢庫 包括left join中的臨時庫 的所有資訊時,資料庫會選擇最優方法 全表掃瞄!s表dept id na...

SQL索引學習 聚集索引

上面兩位朋友的問題有乙個共同特點,就是希望有示例,因為這樣容易讓他們更加容易理解。但從我的角度來講,有示例只能給你提供乙個參考而已,夠不成是否容易消化的關鍵因素,最好的辦法是,通過自己的理解,自己有能力去做相應的實驗,這樣效果才是最好的,你也會發現更多的問題,每個專案都有自己的特點,所以效能優化這塊...