MySQL 數(shù)據(jù)庫索引使用場景&注意事項

目錄

1.何種查詢支持索引碴里?
2.注意事項和建議

一 何種查詢支持索引漱受?

1 MySQL 目前支持前導列


就目前來說化借,mysql 暫時只支持最左前綴原則進行篩選。
例子:創(chuàng)建復合索引
create index idx_a_b_c on tb1(a,b,c)
只有使用如下條件才可能應用到這個復合索引
1.where a=?
2.where a = ? and b = ?
3.where a = ? and b = ? and c = ?
但
4.where a = ? and c = 眷柔?
只會使用到mysql 索引 a 列的信息

2.索引列上的范圍查找


對于某個條件進行范圍查找時糟趾,如果這個列上有索引,且使用 where ... between 
and ... > ,< 等范圍操作休雌,那么可能用到索引范圍查找灶壶,如果索引范圍查找的成本太高,數(shù)據(jù)庫可能會選擇全表掃描的方式
杈曲。
注意 in  不屬于范圍查找的范疇

3.join 列


在聯(lián)合查詢兩個表時驰凛,比如查詢語句為 select a.col1,b.col2 from a join b on a.id = b.id,
其中id 為兩個表的主鍵,如果a是小表担扑,那么a 就被視為驅動表恰响,那么數(shù)據(jù)庫可能全表掃描a 表,
并用 a表的每個id 去探測b表的索引查詢匹配的記錄涌献。

4.where 子句


形如:
where a = ? and b = ? and c>1000
where a = ? and b = ? and c = ? and d>1000

where 子句的條件列是復合索引前面的索引列+另一個列的范圍查找

create  index idx_a_b_c_d on tb1(a,b,c,d);

形如:
where a = ? and b = ? and c>1000
where a = ? and b = ? and c = ? and d>1000
才會用到這個索引

下面兩個查詢:
where a = ? and b =? and c>10000 and d< 10000
這個例子中d 
d <10000這個操作不會走索引
where a >? and b =? and c>10000 and d< 10000
這個例子中a列上有范圍查找胚宦,那么b、c燕垃、d列上的索引信息都不能被利用
原則枢劝,創(chuàng)建索引,考慮把復合索引的范圍查找放到最后卜壕。

5.mysql 優(yōu)化器


mysql 優(yōu)化器會做一些特殊優(yōu)化您旁,比如對于索引查找max(索引列)可以直接進行定位。遇到max轴捎,min  是可以在列上做索引鹤盒。

二 注意事項和建議


1.where 條件中的索引列不能是表達式的一部分,mysql 不支持函數(shù)索引

2.InnoDB 二級索引底層葉子極點存儲的是索引+主鍵值

InnoDB 的非主鍵索引存儲的不是實際的記錄的指針侦副,而是主鍵的值侦锯,所以主鍵最好是整數(shù)型,如自增ID ,基于主鍵存取數(shù)據(jù)是最高效的跃洛,使用二級索引存取數(shù)據(jù)則需要進行二次索引查找率触。

3.索引盡量是高選擇性的

而且要留意基數(shù)值终议,基數(shù)值指的是一個列中不同值的個數(shù)汇竭,顯然,
最大基數(shù)意味著該列中的每個值都是唯一的穴张,最小基數(shù)意味著該列中的所有值都是相同的细燎,索引列的基數(shù)相對于表的行數(shù)較高時,
也就重復值更少皂甘,索引的工作效果更好玻驻。
有種情況雖然基數(shù)很小,但由于數(shù)據(jù)分布很不均勻因此也會導致某些記錄數(shù)很小,
那么這種情況也適合建立索引加速查找這部分數(shù)據(jù)璧瞬。

4.使用更短的索引

可以考慮前綴索引户辫,但應確保選擇的前綴的長度可以保證大部分值是唯一的。
如:alter table test add  key(col(6))
衡量不同前綴索引唯一值比例嗤锉。
select  count(distinct left(col_name,5))/count(*) As sele5渔欢,
select  count(distinct left(col_name,6))/count(*) As sele6,
select  count(distinct left(col_name,7))/count(*) As sele7瘟忱,
select  count(distinct left(col_name,8))/count(*) As sele8奥额,
select  count(distinct left(col_name,9))/count(*) As sele9
from table_name;

5.避免創(chuàng)建過多的索引

索引過多可能會浪費大量空間
尤其本身字段量較大的字符串,索引過多可能會浪費空間访诱,且降低修改數(shù)據(jù)的速度垫挨,
所以,不要創(chuàng)建過多的索引触菜,也不要創(chuàng)建重復的索引九榔。

6.如果是唯一值得列,創(chuàng)建唯一索引會更佳涡相,也可以確保不會出現(xiàn)重復數(shù)據(jù).

7.使用覆蓋索引能大大提高性能

覆蓋索引:所有數(shù)據(jù)都可以從索引中得到帚屉,而不需要去讀物理記錄。例如某個復合索引idx_a_b_c 建立在表tb1 的 a漾峡、b攻旦、c 列上,
那么對于如下的sql 語句
select a,b from tb1 where a = ? and b = ? and c =?
mysql可以直接從索引idx_a_b_c  中獲取數(shù)據(jù)生逸。使用覆蓋索引也可以避免二次索引查找牢屋。
使用explain 命令輸出查詢計劃,如果extra列是“using index ” 那就表示使用的是覆蓋索引槽袄。

8.利用索引來排序

mysql 有兩種方式可以產(chǎn)生有序結果烙无,一種是使用文件排序,另一種是掃描有序的索引遍尺,我們盡量使用索引來排序
 注意事項:
   1. 盡量保證索引列和order by 的列相同截酷,且各列按照相同的順序排序。
    比如在表table1 的復合索引idx_a_b_c(創(chuàng)建在a,b,c上)乾戏;
    如:select * from table1 order by  a,b,c;
           select * from table1 where a=? and b =? order by c
    以上查詢都可以利用有序索引來加速檢索順序迂苛。
   2.如果連接多張表,那么order by 引用的列需要再表連接順序的首張表內(nèi)鼓择。

9 添加冗余索引需要權衡:

  如果一個索引column A 那么一個新的索引(columnA,columnB)就是冗余索引
  一般情況下不論是新增冗余索引三幻,還是擴展原索引為冗余索引,都會導致索引文件的增大呐能,并且增加了維護索引的開銷念搬。
  比如更改了列值,并且在此列上建立了索引,那么這個列值更改之后朗徊,索引是要進行重新排序的首妖。
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市爷恳,隨后出現(xiàn)的幾起案子悯搔,更是在濱河造成了極大的恐慌,老刑警劉巖舌仍,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妒貌,死亡現(xiàn)場離奇詭異,居然都是意外死亡铸豁,警方通過查閱死者的電腦和手機灌曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來节芥,“玉大人在刺,你說我怎么就攤上這事⊥纺鳎” “怎么了蚣驼?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長相艇。 經(jīng)常有香客問我颖杏,道長,這世上最難降的妖魔是什么坛芽? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任留储,我火速辦了婚禮,結果婚禮上咙轩,老公的妹妹穿的比我還像新娘获讳。我一直安慰自己,他們只是感情好活喊,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布丐膝。 她就那樣靜靜地躺著,像睡著了一般钾菊。 火紅的嫁衣襯著肌膚如雪帅矗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天结缚,我揣著相機與錄音损晤,去河邊找鬼。 笑死红竭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茵宪,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼最冰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稀火?” 一聲冷哼從身側響起暖哨,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎凰狞,沒想到半個月后篇裁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡赡若,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年达布,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逾冬。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡黍聂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出身腻,到底是詐尸還是另有隱情产还,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布嘀趟,位于F島的核電站脐区,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏她按。R本人自食惡果不足惜坡椒,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尤溜。 院中可真熱鬧倔叼,春花似錦、人聲如沸宫莱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽授霸。三九已至巡验,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碘耳,已是汗流浹背显设。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辛辨,地道東北人捕捂。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓瑟枫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親指攒。 傳聞我的和親對象是個殘疾皇子慷妙,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容