mysql索引有幾種,mysql有幾種索引型別?使用索引時都有那些地方要注意?sql優化原則

時間 2022-03-14 04:28:26

1樓:匿名使用者

primary, index, unique 這3種是一類primary 主鍵。 就是 唯一 且 不能為空。

index 索引,普通的

unique 唯一索引。 不允許有重複。

fulltext 是全文索引,用於在一篇文章中,檢索文字資訊的。

舉個例子來說,比如你在為某商場做乙個會員卡的系統。

這個系統有乙個會員表

有下列字段:

會員編號 int

會員姓名 varchar(10)

會員身份證號碼 varchar(18)會員** varchar(10)

會員住址 varchar(50)

會員備註資訊 text

那麼這個 會員編號,作為主鍵,使用 primary會員姓名 如果要建索引的話,那麼就是普通的 index會員身份證號碼 如果要建索引的話,那麼可以選擇 unique (唯一的,不允許重複)

會員備註資訊 , 如果需要建索引的話,可以選擇 fulltext,全文搜尋。

不過 fulltext 用於搜尋很長一篇文章的時候,效果最好。

用在比較短的文字,如果就一兩行字的,普通的 index 也可以。

2樓:愛可生雲資料庫

聚集索引:也稱 clustered index。是指關係表記錄的物理順序與索引的邏輯順序相同。

由於一張表只能按照一種物理順序存放,一張表最多也只能存在乙個聚集索引。與非聚集索引相比,聚集索引有著更快的檢索速度。

mysql 裡只有 innodb 表支援聚集索引,innodb 表資料本身就是聚集索引,也就是常說 iot,索引組織表。非葉子節點按照主鍵順序存放,葉子節點存放主鍵以及對應的行記錄。所以對 innodb 表進行全表順序掃瞄會非常快。

非聚集索引:也叫 secondary index。指的是非葉子節點按照索引的鍵值順序存放,葉子節點存放索引鍵值以及對應的主鍵鍵值。

mysql 裡除了 innodb 表主鍵外,其他的都是二級索引。myisam,memory 等引擎的表索引都是非聚集索引。簡單點說,就是索引與行資料分開儲存。

一張表可以有多個二級索引。

mysql有幾種索引型別?使用索引時都有那些地方要注意?sql優化原則

3樓:趣事情

mysql索引型別包括:

一、普通索引

這是最基本的索引,它沒有任何限制。有以下幾種建立方式:

1.建立索引

**如下:

create index indexname on mytable(username(length));

如果是char,varchar型別,length可以小於字段實際長度;如果是blob和text型別,必須指定 length,下同。

2.修改表結構

**如下:

alter mytable add index [indexname] on (username(length)) -- 建立表的時候直接指定。

create table mytable( id int not null, username varchar(16) not null, index [indexname] (username(length)) );

-- 刪除索引的語法:

drop index [indexname] on mytable;

二、唯一索引

它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種建立方式:

**如下:

create unique index indexname on mytable(username(length))

-- 修改表結構

alter mytable add unique [indexname] on (username(length))

-- 建立表的時候直接指定

create table mytable( id int not null, username varchar(16) not null, unique [indexname] (username(length)) );

三、主鍵索引

它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引:

**如下:

create table mytable( id int not null, username varchar(16) not null, primary key(id) );

當然也可以用 alter 命令。記住:乙個表只能有乙個主鍵。

四、組合索引

為了形象地對比單列索引和組合索引,為表新增多個字段:

**如下:

create table mytable( id int not null, username varchar(16) not null, city varchar(50) not null, age int not null );

為了進一步榨取mysql的效率,就要考慮建立組合索引。

二:使用索引的注意事項

使用索引時,有以下一些技巧和注意事項:

1.索引不會包含有null值的列

只要列中包含有null值都將不會被包含在索引中,復合索引中只要有一列含有null值,那麼這一列對於此復合索引就是無效的。所以我們在資料庫設計時不要讓字段的預設值為null。

2.使用短索引

對串列進行索引,如果可能應該指定乙個字首長度。例如,如果有乙個char(255)的列,如果在前10個或20個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作。

3.索引列排序

mysql查詢只使用乙個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立復合索引。

4.like語句操作

一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是乙個問題。like 「%aaa%」 不會使用索引而like 「aaa%」可以使用索引。

5.不要在列上進行運算

select * from users where year(adddate)<2007;

將在每個行上進行運算,這將導致索引失效而進行全表掃瞄,因此我們可以改成:

select * from users where adddate<『2007-01-01';

6.不使用not in和<>操作。

三:sql優化原則

常見的簡化規則如下:

1.不要有超過5個以上的表連線(join)

2.考慮使用臨時表或表變數存放中間結果。

3.少用子查詢

4.檢視巢狀不要過深,一般檢視巢狀不要超過2個為宜。

5.連線的表越多,其編譯的時間和連線的開銷也越大,效能越不好控制。

6.最好是把連線拆開成較小的幾個部分逐個順序執行。

7.優先執行那些能夠大量減少結果的連線。

8.拆分的好處不僅僅是減少sql server優化的時間,更使得sql語句能夠以你可以**的方式和順序執行。

如果一定需要連線很多表才能得到資料,那麼很可能意味著設計上的缺陷。

4樓:愛可生雲資料庫

大部分開發會了解這樣的《開發規範》:建立索引要選擇區分度高的字段。他們會認為區分度低的字段不適合建立索引或者不適合新增到組合索引裡面。

但是這樣的操作會導致很多慢查。舉例來說:

select  * from  tab where a=1 and b=2;

場景 1

符合 a=1的記錄數有 10w 條記錄 ,b=2 有 1000 條記錄。如果只是建立idx_a(a),sql 請求通過索引idx_a訪問 10w 條件記錄,然後還要逐一匹配 10w 條記錄中的 status,找到符合 b=2的記錄。這個動作會導致慢查。

如果建立組合索引idx_ab(a,b),sql 請求通過索引idx_ab可以直接定位到 1000 條記錄,無需額外的過濾。這樣減少訪問 9900 條記錄的時間,提公升查詢速度。

場景 2

符合 a=1的有 100 條記錄,status=2 有 10 條記錄。其實場景 2 因為資料量比較少,直接訪問 100 條記錄和定位到 10 條記錄的時間消耗相差不大,量變不足以引發質變,可以忽略了。

tips:

建立索引的目的是通過索引盡可能找到匹配 where 條件的行,減少不必要的回表,提高查詢效率;

需要辯證地看待區分度比較低的字段在組合索引中的作用。在組合索引的情況下,我們不能只是單純地看字段的區分度,而是要看符合條件的記錄數是多少。符合條件的記錄越少,效能越好。

mysql索引有哪些

mysql支援哪幾種索引

5樓:匿名使用者

從資料結構角度

1、b+樹索引(o(log(n)))。

2、hash索引:

a 僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢

b 其檢索效率非常高,索引的檢索可以一次定位,不像b-tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引的查詢效率要遠高於 b-tree 索引

c 只有memory儲存引擎顯示支援hash索引

3、fulltext索引(現在myisam和innodb引擎都支援了)

4、r-tree索引(用於對gis資料型別建立spatial索引)

從物理儲存角度

1、聚集索引(clustered index)

2、非聚集索引(non-clustered index)

從邏輯角度

1、主鍵索引:主鍵索引是一種特殊的唯一索引,不允許有空值

2、普通索引或者單列索引

3、多列索引(復合索引):復合索引指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。使用復合索引時遵循最左字首集合

4、唯一索引或者非唯一索引

5、空間索引:空間索引是對空間資料型別的字段建立的索引,mysql中的空間資料型別有4種,分別是geometry、point、linestring、polygon。mysql使用spatial關鍵字進行擴充套件,使得能夠用於建立正規索引型別的語法建立空間索引。

建立空間索引的列,必須將其宣告為not null,空間索引只能在儲存引擎為myisam的表中建立

create table table_name[col_name data type]

[unique|fulltext|spatial][index|key][index_name](col_name[length])[asc|desc]

1、unique|fulltext|spatial為可選引數,分別表示唯一索引、全文索引和空間索引;

2、index和key為同義詞,兩者作用相同,用來指定建立索引

3、col_name為需要建立索引的字段列,該列必須從資料表中該定義的多個列中選擇;

4、index_name指定索引的名稱,為可選引數,如果不指定,mysql預設col_name為索引值;

5、length為可選引數,表示索引的長度,只有字串型別的字段才能指定索引長度;

6、asc或desc指定公升序或降序的索引值儲存

mysql有幾種索引型別?使用索引時都有那些地方要注意?sq

mysql索引型別包括 一 普通索引 這是最基本的索引,它沒有任何限制。有以下幾種建立方式 1.建立索引 如下 create index indexname on mytable username length 如果是char,varchar型別,length可以小於字段實際長度 如果是blob和t...

mysql索引採用什麼資料結構,mysql的索引用的什麼資料結構

文就是對這兩種資料結構做簡單的介紹。1.b tree b tree不是 b減樹 而是 b樹 這裡參考了嚴蔚敏 資料結構 對b tree的定義 一棵m階的b tree,或者為空樹,或者滿足下列特性 1.樹中每個結點至多有m棵子樹 2.若根結點不是葉子結點,則至少有兩棵子樹 3.除根節點之外的所有非終端...

mysql索引型別解釋,MYSQL的各個索引型別有什麼區別?

primary,index,unique 這3種是一類primary 主鍵。就是 唯一 且 不能為空。index 索引,普通的 unique 唯一索引。不允許有重複。fulltext 是全文索引,用於在一篇文章中,檢索文字資訊的。舉個例子來說,比如你在為某商場做乙個會員卡的系統。這個系統有乙個會員表...

MySQL索引的Index method中btree和has

當分片索引不是純整型的字串時,只接受整型的內建 hash 演算法是無法使用的。為此,stringhash 按照使用者定義的起點和終點去擷取分片索引欄位中的部分字元,根據當中每個字元的二進位制 unicode 值換算出乙個長整型數值,然後就直接呼叫內建 hash 演算法求解分片路由 先求模得到邏輯分片...

mysql索引什麼意思,在mysql資料庫中為字段新增索引,是什麼意思,有什麼好處,謝謝!!

mysql支援很多資料型別,選擇合適的資料型別儲存資料對效能有很大的影響。通常來說,可以遵循以下一些指導原則 1 越小的資料型別通常更好 越小的資料型別通常在磁碟 記憶體和cpu快取中都需要更少的空間,處理起來更快。2 簡單的資料型別更好 整型資料比起字元,處理開銷更小,因為字串的比較更複雜。在my...