索引 學習總結

2021-10-05 17:07:20 字數 4497 閱讀 1900

mysql中

sql seerver中

檢視索引

mysql設計索引的原則

sql server索引設計原則

索引的資料結構

聚集索引和非聚集索引

復合索引的使用

參考資料

索引是對資料庫表中乙個或多個列的值進行排序的結構,使用索引可快速訪問資料庫表中的特定資訊。通俗的講,索引就相當於目錄。

優點:

缺點:

建立索引

第一種, 使用create index 命令(但是,不能建立primary key索引)

create

[unique

|fulltext|spatial]

index index_name [

using index_type]

on tbl_name (index_col_name,..

.)其中index_col_name格式:

col_name[

(length)][

asc|

desc

]

spatial 表示空間索引,不常用

第二種,是用 alter table命令去增加索引

alter

table tbl_name add

index index_name(index_col_name,..

.) 新增普通索引,索引值可出現多次

alter

table tbl_name add

unique

index index_name(index_col_name,..

.) 建立的索引值必須是唯一的(除了null外)

alter

table tbl_name add

primary

keyindex index_name(index_col_name,..

.) 該語句新增了乙個主鍵,索引值必須唯一,不能為null

alter

table tbl_name add fulltext index index_name(index_col_name,..

.) 指定了索引為fulltext,用於全文索引

第三種,在建立表時,直接指定

create

table tbl_name(

column_name_1 column_type_1 constraints,

column_name_2 column_type_2 constraints,..

.index

[index_name]

(col_name[

(length)][

asc|

desc])

);

刪除索引
drop

index index_name on tbl_name

測試索引

mysql中使用explain語句,檢視執行計畫,例如

explain

select

*from test where name =

'tom' \g

建立索引

建立聚集索引

方法一

alter

table

addconstraint

primary

key(columnname asc

|desc,.

..)with

(drop_existing =

on)

注意

用下面的方式刪除索引:

drop

index

on

若對唯一鍵生成的索引直接刪除,會出現下面錯誤:

an explicit drop index is not allowed on index 『…』. it is being used for primary key constraint enforcement.

正確的做法,刪除表約束:

alter

table

drop

constraint

方法二:

create

clustered

index

on(column_name asc

|desc,.

..)with

(drop_existing =

on)

建立復合索引
create

index

on(column_name asc

|desc,.

..)with

(drop_existing =

on)

一般是使用多個列

建立覆蓋索引

create

index index_name on table_name (columnname asc

|desc[,

....

..]) include(column_name_list)

with

(drop_existing =on)

;

首先,覆蓋索引它只是非聚集索引的一種特別形式,下文說的非聚集索引不包涵覆蓋索引,當然這個約定只適用於這一段話,這樣做的目的是為了說明各中的區別。

首先:1、非聚集索引不包含資料,通過它找到的只是檔案中資料行的引用(表是堆的情況下)或是聚集索引的引用,sql server要通這個引用去找到相應的資料行。

2、正因為非聚集索引它沒有資料,才引發第二次查詢。

3、覆蓋索引就是把資料加到非聚集索引上,這樣就不需要第二次查詢了。這是一種以空間換效能的方法。非聚集索引也是。只是做的沒有它這麼出格。

建立唯一索引

create

unique

index

on(column_name asc

|desc,.

..)with

(drop_existing =

on)

注意

檢視索引

sql server中檢視乙個表中有哪些索引

execute sp_helpindex @objname

=''

sql server中檢視具體的索引相關資訊

dbcc show_statistics('',

'')上面這條語句,會查出三種資訊,用來分析目標索引

select

*from sysindexes where name =

''

請參考msdn的官方文件

sql server 索引設計指南

索引的資料結構是b樹,b樹是一種用於查詢的平衡多叉樹

非聚集索引和聚集索引的區別在於, 通過聚集索引可以查到需要查詢的資料, 而通過非聚集索引可以查到記錄對應的主鍵值 , 再使用主鍵的值通過聚集索引查詢到需要的資料

為了提高某個屬性(或屬性組)的查詢速度,把這個或這些屬性(稱為聚集碼)上具有相同值的元組集中存放在連續的物理塊稱為聚集。

在sql server中,聚集的作用就是將某一列(或是多列)的物理順序改變為和邏輯順序相一致. 聚集索引的儲存是以b樹儲存,b樹的葉子直接儲存聚集索引的資料. 因為聚集索引改變的是其所在表的物理儲存順序,所以每個表只能有乙個聚集索引.

因為每個表只能有乙個聚集索引,如果我們對乙個表的查詢不僅僅限於在聚集索引上的字段。我們又對聚集索引列之外還有索引的要求,那麼就需要非聚集索引了.

非聚集索引,本質上來說也是聚集索引的一種.非聚集索引並不改變其所在表的物理結構,而是額外生成乙個聚集索引的b樹結構,但葉子節點是對於其所在表的引用,這個引用分為兩種,如果其所在表上沒有聚集索引,則引用行號。如果其所在表上已經有了聚集索引,則引用聚集索引的頁.

非聚集索引需要額外的空間進行儲存,按照被索引列進行聚集索引,並在b樹的葉子節點包含指向非聚集索引所在表的指標.

通過非聚集索引的原理可以看出,如果其所在表的物理結構改變後,比如加上或是刪除聚集索引,那麼所有非聚集索引都需要被重建,這個對於效能的損耗是相當大的。所以最好要先建立聚集索引,再建立對應的非聚集索引.

必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引。

例子

例如索引包括三個字段(a, b, c),只有下面三種方式,才能使用到該索引:

where a= ? and b = ? and c = ?

where a=? and b=?

where a=?

索引資料結構參考

優化

mysql索引學習總結

最近用到mysql索引,趕緊了解了一下,最後做乙個小小的總結。索引,就是按照索引排好序的資料結構,查詢資料的時候走索引比不走索引要快很多,因為不走索引意味著全表掃瞄,而且還可能會鎖住元組,效率比較低。mysql使用b tree的索引模型,無論是myisam還是innodb。為什麼使用b 樹而不是紅黑...

mysql索引學習總結

優勢 劣勢 索引也是一張表,該錶儲存了主鍵與索引字段,並指向實體表的記錄,所以索引也是占用空間的 雖然提高了查詢速度,但是會降低更新表的速度,如果對錶進行insert update 和delete。因為更新表,不僅要儲存資料,還要儲存一下索引檔案每次更新新增了索引列的字段,都會調整更新帶來的兼職變化...

mysql學習總結 索引 未完

部落格位址僅此而已。回憶一下當時的想法真的很可笑,老是喜歡搞一些表面的東西,實際上當時的部落格對自己的收穫微乎其微,純屬為了 寫而寫。現在呢,實習快半年了,實習期間做了很多事情,但是回想自己的收穫,的確有進步,是什麼說不出來。參加實習的這段時間 以來,每天在公司待到十點學習新的知識,從來不曾懈怠,可...