mysql有那些索引?分別在什麼場景使用

時間 2022-07-22 14:50:23

1樓:智者總要千慮

一、普通索引

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

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有那些索引?分別在什麼場景使用

2樓:匿名使用者

一、普通索引

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

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索引的資料結構,為什麼用b 樹

顏竹稱畫 先從資料結構的角度來答。題主應該知道b 樹和b 樹最重要的一個區別就是b 樹只有葉節點存放資料,其餘節點用來索引,而b 樹是每個索引節點都會有data域。這就決定了b 樹更適合用來儲存外部資料,也就是所謂的磁碟資料。mysql索引的資料結構,為什麼用b 樹 暱兒親 先從資料結構的角度來答。...

mysql的索引主要作用是什麼,MYSQL的索引主要作用是什麼!

索引可以加快資料檢索操作,但會使資料修改操作變慢。每修改資料記錄,索引就必須重新整理一次。為了在某種程度上彌補這一缺陷,許多sql命令都有一個delay key write項。這個選項的作用是暫時制止mysql在該命令每插入一條新記錄和每修改一條現有之後立刻對索引進行重新整理,對索引的重新整理將等到...

請問濟南有那些大學,分別在什麼地方 謝謝

辛公子 好多啊 你下個谷歌地圖 可以邊看邊找哈 惡魔月天使 山東工藝美術學院 6 山東公共關係專修學院 1 山東廣播電視大學 2 山東華夏藝術學院 1 山東華洋學院 1 山東濟南人民醫學專科學校 1 山東濟南協和專修學院 1 山東勞動職業技術學院 3 山東濟南章丘有哪些大學 山東經濟學院新校 山東財...