mysql 什麼時候用單列索引?什麼使用用聯合索引?

時間 2021-06-04 22:17:08

1樓:小王子

小王子:《讀Mysql實戰》

我們新增索引的目的是為了在我們查詢的時候可以盡量少回表,在回表的時候會產生大量的記憶體緩衝,大大降低SQl的查詢效率,所以我們在建立索引的時候,要盡量遵循主鍵建立唯一索引,聯合索引將查詢的條件,查詢的字段,還有排序或分組的字段,建立聯合索引!

2樓:范孝鵬

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一下,去除其餘的學生。

兩種情況都不是最優的,這個時候使用聯合索引最合適,通過索引直接找到對應記錄。

什麼時候用 Chinese,什麼時候用 China s,什麼時候用 of China?

已登出 s強調屬於某人,of強調被屬於的東西。比如my father s friend強調father s,a friend of my father強調friend。Chinese通常表示 中式的 但其實也可以用來表示 中國的 中國經濟最好說成China s economy,但說成Chinese ...

什麼時候用do u 提問 什麼時候用are u 提問?

學而思teacher 句子的謂語動詞分為兩種,一種是am is are 這類be 動詞。一種是實意動詞 即有實際意義的詞比如跑跳吃等等 陳述句中如果是be 動詞,提問就用be 放句首。如果是實意動詞,就把do does 放句首。 楊友建 Do you 是由 主語 動詞 演變而來的。Are you是由...

這裡動詞什麼時候用 ing 形式,什麼時候用 ed 形式?

英語思維 你需要看一下非謂語動詞的起源,就明白了。動詞有三種存在形式 1.原形動詞 2.非謂語動詞 3.謂語動詞 原形動詞就是光頭司令,動作最本源的意思,不可出現在任何短語,句子中。非謂語動詞就是光頭司令要麼帶了帽子 to v 要麼加了尾巴 v ing v ed 表達不含時間的動作所處的狀態 不定 ...