1. 程式人生 > >MYSQL 什麽時候用單列索引?什麽使用用聯合索引?(收集)

MYSQL 什麽時候用單列索引?什麽使用用聯合索引?(收集)

img OS 所有 post 老師 tab 統計 最優 jpg

我一個表 students 表,有3個字段 ,id,name,age 我要查詢 通過 name 和age,在這兩個字段 是創建 聯合索引?還是分別在name和age上創建 單列索引呢? 多個字段查詢什麽情況下用聯合索引 什麽時候分別創建單列索引呢?


1,首先要確定優化的目標,在什麽樣的業務場景下,表的大小等等。如果表比較小的話,可能都不需要加索引。
2,哪些字段可以建索引,一般都where、order by 或者 group by 後面的字段。
3,記錄修改的時候需要維護索引,所以會有開銷,要衡量建了索引之後的得與失。

學生表,可以認為name的重復度比較小,而age的重復度比較大,對於單列索引來說,比較適合建在重讀度低的列上。

對於select * from students where name=‘張三’and age=18; 題主所說的兩種情況
A. name 和 age 各自單獨建立索引。
一般來說mysql會選擇其中一個索引,name的可能性比較大,因為mysq會統計每個索引上的重復度,選用低重復度的字段。另外一個age的索引就不會用到,但還有維護索引的開銷,所以age的索引不需要創建。

B. name和age的聯合索引
這種索引的切合度最好,mysql會直接選用這個索引。但相對單獨的name索引來說,維護的成本要大一些,並且索引數據占用的存儲空間也要更大一些。

回過來看,有必要使用聯合索引嗎? 我的看法是沒有必要,因為學校裏可能會有重名的人,但比較少。用name就可以比較精準的找到記錄,即使有重復的也比較少。

什麽情況下使用聯合索引比較好呢? 舉一個例子,大學選認課老師,需要創建一個關系對應表,有2個字段,student_id 和 teacher_id,想要查詢某個老師和某個學生是否存在師生關系。
一個學生會選幾十個老師,一個老師會帶幾百個學生
如果只為student_id建立索引的情況下,經過索引會選出幾十條記錄,然後在內存中where一下,去除其余的老師。
相反如果只為teacher_id建立索引,經過索引會選出幾百條記錄,然後在內存中where一下,去除其余的學生。
兩種情況都不是最優的,這個時候使用聯合索引最合適,通過索引直接找到對應記錄。 創建索引實例:

首先創建一個表:create table students (id int primary key,name varchar(20),age Int);

創建單個索引的語法:create index 索引名 on 表名(字段名)

索引名一般是:表名_字段名

給id創建索引:create index students _id on students (id);

創建聯合索引的語法:create index 索引名 on 表名(字段名1,字段名2)

給name和age創建聯合索引:create index students _name_age on students (name,age)

MySQL_MySQL 聯合索引詳解 以及註意事項

聯合索引又叫復合索引。對於復合索引:Mysql從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進行查找,但不支持 b,c進行查找 .當最左側字段是常量引用時,索引就十分有效。


兩個或更多個列上的索引被稱作復合索引。
利用索引中的附加列,您可以縮小搜索的範圍,但使用一個具有兩列的索引 不同於使用兩個單獨的索引。復合索引的結構與電話簿類似,人名由姓和名構成,電話簿首先按姓氏對進行排序,然後按名字對有相同姓氏的人進行排序。如果您知 道姓,電話簿將非常有用;如果您知道姓和名,電話簿則更為有用,但如果您只知道名不姓,電話簿將沒有用處。
所以說創建復合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜索或僅對前幾列執行搜索時,復合索引非常有用;僅對後面的任意列執行搜索時,復合索引則沒有用處。
如:建立 姓名、年齡、性別的復合索引。

create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);

優: select * from test where a=10 and b>50
差: select * from test where a50

優: select * from test order by a
差: select * from test order by b
差: select * from test order by c

優: select * from test where a=10 order by a
優: select * from test where a=10 order by b
差: select * from test where a=10 order by c

優: select * from test where a>10 order by a
差: select * from test where a>10 order by b
差: select * from test where a>10 order by c

優: select * from test where a=10 and b=10 order by a
優: select * from test where a=10 and b=10 order by b
優: select * from test where a=10 and b=10 order by c

優: select * from test where a=10 and b=10 order by a
優: select * from test where a=10 and b>10 order by b
差: select * from test where a=10 and b>10 order by c



技術分享圖片


索引原則

1.索引越少越好
原因:主要在修改數據時,第個索引都要進行更新,降低寫速度。
2.最窄的字段放在鍵的左邊
3.避免file sort排序,臨時表和表掃描.

MYSQL 什麽時候用單列索引?什麽使用用聯合索引?(收集)