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

時間 2022-03-02 15:23:56

1樓:趣事情

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語句能夠以你可以**的方式和順序執行。

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

2樓:愛可生雲資料庫

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

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

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有幾種索引型別?使用索引時都有那些地方要注意

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語句能夠以你可以**的方式和順序執行。

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

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

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

五類車是哪五類,五類車有哪幾種?

五類車,在一些媒的語境下,是指電動車 電單車 三輪車 殘疾人機動輪椅車和改裝拼裝車。但 五類車 本來就是不科學的提法,電動車 電單車 三輪車 殘疾人機動輪椅車都是合法的交通工具,是群眾生活和生產的必需品,而改裝 拼裝 報廢 車才是非法工具。將合法的日常工具和非法工具混為一談,其荒誕性不言而喻。好比將...

閥門的總類有哪幾種,閥門都有幾種型別

上海思氟閥門 閥門是流體輸送系統中的控制部件,具有截止 調節 導流 防止逆流 穩壓 分流或溢流洩壓等功能。按作用和用途 1 截斷類 如閘閥 截止閥 旋塞閥 球閥 蝶閥 針型閥 隔膜閥等。截斷類閥門又稱閉路閥,截止閥,其作用是接通或截斷管路中的介質。止回閥,止回閥又稱單向閥或逆止閥,止回閥屬於一種自動...

會計科目表中負債類的有哪幾種,負債類的會計科目有哪些

1 按負債的流動性劃分,負債類賬戶可分為反映流動負債的賬戶和反映長期負債的賬戶,其中,反映流動負債的賬戶包括 短期借款 應付賬款 應交稅金 等,反映長期負債的賬戶包括 長期借款 應付債券 長期應付款 等。流動負債類賬戶反映企業將在一年或在超過一年的乙個營業週期內償還的債務。長期負債類賬戶反映償還期在...

閥門總共分為多少類,閥門分為幾種種類?有什麼區別?

分類按作用和用途 一 關斷閥 這類閥門是起開閉作用的。常設於冷 熱源進 出口,裝置進 出口,管路分支線 包括立管 上,也可用作放水閥和放氣閥。常見的關斷閥有閘閥 截止閥 球閥和蝶閥等。閘閥可分為明杆和暗杆 單閘板與雙閘板 楔形閘板與平行閘板等。閘閥關閉嚴密性不好,大直徑閘閥開啟困難 沿水流方向閥體尺...