国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

我面試幾乎必問:你設(shè)計(jì)索引的原則是什么?怎么避免索引失效?

開發(fā) 開發(fā)工具
MySQL針對主鍵索引會(huì)維護(hù)一個(gè)B+樹的結(jié)構(gòu),這個(gè)我們稱之為聚簇索引,針對非主鍵(一般都是建立的聯(lián)合索引)會(huì)對索引字段依次排序,然后從第一個(gè)字段值開始比較,第一個(gè)字段值相同就針對下一個(gè)字段值進(jìn)行比較,依次往后推。

 [[398490]]

之前我們已經(jīng)詳細(xì)介紹了關(guān)于索引的原理和索引的查詢的原則,所謂工欲善其事必先利其器,各位在學(xué)習(xí)階段一定要要循序漸進(jìn)的來學(xué)習(xí)這塊知識(shí),千萬不要眼高手低,一定要不急不躁,爭取一個(gè)蘿卜一個(gè)坑,學(xué)完后能一次性拿下這些知識(shí)點(diǎn),然后再加以運(yùn)用。

前面的文章我們討論過,索引的設(shè)計(jì)要根據(jù) WHERE 條件和 ORDER BY 還有 GROUP BY 后面的字段進(jìn)行設(shè)計(jì),至于原因具體在我前面的文章MySQL索引的原理有詳細(xì)介紹。這里我們再簡單概述下。

MySQL針對主鍵索引會(huì)維護(hù)一個(gè)B+樹的結(jié)構(gòu),這個(gè)我們稱之為聚簇索引,針對非主鍵(一般都是建立的聯(lián)合索引)會(huì)對索引字段依次排序,然后從第一個(gè)字段值開始比較,第一個(gè)字段值相同就針對下一個(gè)字段值進(jìn)行比較,依次往后推。

如果聯(lián)合索引中的字段值都是一樣的,那么就根據(jù)主鍵來排序。另外聚簇索引(主鍵索引)的B+樹中保存的是一行記錄的所有信息,非聚簇索引(非主鍵索引)僅僅保存索引字段值和主鍵字段值。

好了,對于索引原理的回顧我們就介紹到這里,本篇文章,我們繼續(xù)介紹的是MySQL設(shè)置的基本原則,這個(gè)也很好理解,就是在設(shè)計(jì)和建立索引的時(shí)候需要遵循哪些原則,按照“標(biāo)準(zhǔn)”去建立索引。今天我們就將關(guān)于索引的設(shè)計(jì)的所有的原則一次性講清楚。

再多說幾句,關(guān)于這個(gè)知識(shí)點(diǎn),在面試的時(shí)候,我經(jīng)常會(huì)問候選人,以此來判斷他對索引是不是真的有理解,而不是簡單的背八股文!

主鍵索引

對于主鍵索引其實(shí)是最簡單的,但是這里有一些注意的地方還是再啰嗦下。

大家在設(shè)計(jì)主鍵的時(shí)候一定要是自增的,非常不建議使用UUID作為主鍵。

為什么?因?yàn)閁UID是無序的,MySQL在維護(hù)聚簇索引的時(shí)候都是按照主鍵的順序排序的,也就是說每個(gè)數(shù)據(jù)頁中的數(shù)據(jù)一定是按照主鍵從小到排序的,而且,數(shù)據(jù)與數(shù)據(jù)之前是通過單向鏈表連接的,上一個(gè)數(shù)據(jù)頁中的最大的主鍵的值一定是小于下一個(gè)數(shù)據(jù)頁中的最小的主鍵的值,數(shù)據(jù)頁和數(shù)據(jù)頁之間是通過雙向鏈表來維護(hù)的。

我們還是老規(guī)矩,畫個(gè)圖幫助大家理解

如果主鍵是自增的,MySQL只需要根據(jù)主鍵目錄能很快的定位到新增的記錄應(yīng)該插入到哪里,如果主鍵不是自增的那么每次都需要從頭開始比較,然后找到合適的位置,再將記錄插入進(jìn)去,這樣真的嚴(yán)重影響效率,所以主鍵的設(shè)計(jì)一定要是自增的。

另外唯一索引和主鍵索引類似,但是唯一索引不一定是自增的,所以維護(hù)唯一索引的成本肯定是大于主鍵索引的。

但是唯一索引的值是唯一的(唯一索引可以有一個(gè)值為 NULL),可以更快的通過索引字段來確定一條記錄,但是可能需要進(jìn)行回表查詢(至于什么是回表就不再贅述了,前面文章已經(jīng)詳細(xì)的講解過了)。

為頻繁查詢的字段建立索引

我們在建立索引的時(shí)候,要為那些經(jīng)常作為查詢條件的字段建立索引,這樣能夠提高整個(gè)表的查詢速度。

但是查詢條件一般不是一個(gè)字段,所以一般是建立的聯(lián)合索引比較多。

另外查詢條件中一般會(huì)有l(wèi)ike這樣的模糊查詢,如果是模糊查詢請最好遵守最左前綴查詢原則。

避免為"大字段"建立索引

這個(gè)可以換句話說:就是盡量使用數(shù)據(jù)量小的字段作為索引。

舉個(gè)例子來說,假設(shè)有兩個(gè)這樣的字段,一個(gè)是varchar(5),一個(gè)是varchar(200),這種情況下優(yōu)先選擇為varchar(5)的字段建立索引,因?yàn)镸ySQL在維護(hù)索引的時(shí)候是會(huì)將字段值一起維護(hù)的,那這樣必然會(huì)導(dǎo)致索引占用更多的空間,另外在排序的時(shí)候需要花費(fèi)更多的時(shí)間去對比。

那假如就要為varchar(100)建立索引呢?那就取部分?jǐn)?shù)據(jù),例如 address 類型為varchar(200),在建立索引的時(shí)候可以這么寫:

  1. CREATE INDEX  tbl_address ON dual(address(20)); 

選擇區(qū)分度大的列作為索引

這又是什么意思?舉個(gè)例子相信大家一下子就明白了。

假設(shè)現(xiàn)在有一個(gè)"性別"字段,里面存放的數(shù)據(jù)的值要么是男,要么是女,那么這樣的字段很不適合作為索引。

這樣的字段的值的主要特點(diǎn)就是區(qū)分度不夠高,而區(qū)分度不高的字段不適合做索引,為什么呢?

因?yàn)槿绻党霈F(xiàn)的幾率幾乎相等,那么無論搜索哪個(gè)值都可能得到一半的數(shù)據(jù)。

在這些情況下,還不如不要索引,因?yàn)镸ySQL他還有一個(gè)查詢優(yōu)化器,查詢優(yōu)化器發(fā)現(xiàn)某個(gè)值出現(xiàn)在表的數(shù)據(jù)行中的百分比很高的時(shí)候,它一般會(huì)忽略索引,進(jìn)行全表掃描。

慣用的百分比界線是"30%"。(匹配的數(shù)據(jù)量超過一定限制的時(shí)候查詢器會(huì)放棄使用索引(這也是索引失效的場景之一哦)。

這就是原因。所以看到這里相信大家應(yīng)該知道為什么要盡量避免使用基數(shù)小的字段作為索引了吧。其實(shí)這里涉及到MySQL的一個(gè)專有名詞【Cardinality(索引基數(shù))是mysql索引很重要的一個(gè)概念】

盡量為ORDER BY 和 GROUP BY 后面的字段建立索引

將 Order By后面的字段建立索引,這樣在查詢的時(shí)候就不需要再去做一次排序了,因?yàn)槲覀兌家呀?jīng)知道了建立索引之后在B+樹中的記錄都是排序好的。

GROUP BY 和 ORDER BY 其實(shí)是類似,所以將這兩個(gè)放在一起說了。

因?yàn)樵贕ROUP BY 的時(shí)候也要先根據(jù) GROUP BY 后面的字段排序,然后在執(zhí)行聚合操作。

如果 GROUP BY 后面的字段沒有排序,那么這個(gè)時(shí)候MySQL是需要先進(jìn)行排序的,這樣就會(huì)產(chǎn)生臨時(shí)表,一個(gè)排好序的臨時(shí)表,然后再在臨時(shí)表中執(zhí)行聚合操作,這樣子當(dāng)然效率很低了,如果 GROUP BY 后面的字段已經(jīng)建立了索引,那么MySQL 就不需要再去排序,也就不會(huì)產(chǎn)生臨時(shí)表。

然而比較坑的是,如果 GROUP BY的列和 ORDER BY的列不一樣,即使都有索引也會(huì)產(chǎn)生臨時(shí)表,其實(shí)對于這些情況我網(wǎng)上搜了下好像還很多,這里我給大家列出來,說實(shí)話,這些雖然是標(biāo)準(zhǔn),但是這個(gè)標(biāo)準(zhǔn)好像很難實(shí)現(xiàn),因?yàn)閷?shí)際的場景肯定沒這么簡單和單純

  1. 如果GROUP BY 的列沒有索引,產(chǎn)生臨時(shí)表. 
  2.  
  3. 如果GROUP BY時(shí),SELECT的列不止GROUP BY列一個(gè),并且GROUP BY的列不是主鍵 ,產(chǎn)生臨時(shí)表.  
  4.  
  5. 如果GROUP BY的列有索引,ORDER BY的列沒索引.產(chǎn)生臨時(shí)表.  
  6.  
  7. 如果GROUP BY的列和ORDER BY的列不一樣,即使都有索引也會(huì)產(chǎn)生臨時(shí)表.  
  8.  
  9. 如果GROUP BYORDER BY的列不是來自JOIN語句第一個(gè)表.會(huì)產(chǎn)生臨時(shí)表.  
  10.  
  11. 如果DISTINCT 和 ORDER BY的列沒有索引,產(chǎn)生臨時(shí)表. 
  12.  
  13. GROUP BY 和 ORDER BY 的列一樣且是主鍵,但SELECT 列含有除GROUP BY列之外的列,也會(huì)產(chǎn)生臨時(shí)表  

不要在條件中使用函數(shù)

如果是已經(jīng)建立好的索引的字段在使用的時(shí)候執(zhí)行了函數(shù)操作,那么這個(gè)索引就使用不到了。

這是為什么?

因?yàn)镸ySQL為該索引維護(hù)的B+樹就是基于該字段原始數(shù)據(jù)的,如果正在使用過程中加了函數(shù),MySQL就不會(huì)認(rèn)為這個(gè)是原來的字段,那肯定不會(huì)走索引了。

但是如果有人就犟,那我就要使用到函數(shù)怎么辦?總不能為了索引而改變業(yè)務(wù)啊?如果是使用MySQL內(nèi)部函數(shù)導(dǎo)致索引失效的,那么在建立索引的時(shí)候可以連著函數(shù)一起創(chuàng)建。

這又是什么意思?假設(shè)有一個(gè)字段叫age,并為其創(chuàng)建了索引,但是使用的時(shí)候是這樣子的

  1. SELECT * FROM student WHERE round(age) = 2; 

這個(gè)時(shí)候索引是使用不到的,那么如果真的非要讓round(age)也走索引,那么你可以這么創(chuàng)建索引

  1. create index stu_age_round on test(round(age)); 

這個(gè)時(shí)候在通過上面的方式去查詢,索引就是生效的,相信這個(gè)大家是能想明白的。

不要建立太多的索引

因?yàn)镸ySQL維護(hù)索引是需要空間和耗費(fèi)性能的,MySQL會(huì)為每個(gè)索引字段維護(hù)一顆B+樹。

所以如果索引過多,這無疑是增加了MySQL的負(fù)擔(dān)。

頻繁增刪改的字段不要建立索引

這個(gè)就很好理解了,因?yàn)槲覀兦懊嬖缇徒榻B過,字段的變化MySQL是需要重新維護(hù)索引的。

假設(shè)某個(gè)字段頻繁修改,那就意味著需要頻繁的重建索引,這必然影響MySQL的性能啊。這里不再多說了。

說到這里大部分說的是所以設(shè)計(jì)的時(shí)候需要注意的一些原則,其實(shí)真正的原則還是需要根據(jù)實(shí)際的業(yè)務(wù)變更的,沒有所謂的“公式”,只要適合自己實(shí)際的業(yè)務(wù)場景的設(shè)計(jì)才是最好的。所以大家也不要過于追求“優(yōu)化”,因?yàn)檫@樣往往會(huì)適得其反,畢竟脫離了業(yè)務(wù)談技術(shù)就是在耍流氓。

好了下面我們再來一起重點(diǎn)看看哪些情況下索引會(huì)失效。(PS:本文基本全是理論,我想畫圖來表達(dá),結(jié)果發(fā)現(xiàn)根本無法下手希望大家再堅(jiān)持下,就快完事了。)

索引失效的常見場景

使用 OR 關(guān)鍵字會(huì)導(dǎo)致索引失效,不過如果要想使用OR 又不想讓索引失效,那就得需要為or條件中的每個(gè)列都建立索引。這很顯然是和上面的不要建立太多的索引相違背。

聯(lián)合索引如果不遵循最左前綴原則,那么索引也將失效

使用模糊查詢的時(shí)候以%開頭也會(huì)導(dǎo)致索引失效(這里就不再重復(fù)原因了,因?yàn)榍懊娴奈恼露际钦f過了,這里就是為了幫助大家再會(huì)回憶下)

索引列如果使用了隱式轉(zhuǎn)換也會(huì)導(dǎo)致索引失效

假設(shè)字段 age 類型為 int,那我們一般是這么查詢的

  1. SELECT * FROM student WHERE age=15 

上面這種情況是能使用到索引的,但是如果你這么寫

  1. SELECT * FROM student WHERE age='15' 

那這種情況是使用不到索引的,也就是age列情的索引是失效的。

如果字段基數(shù)小也可能會(huì)導(dǎo)致索引失效,具體在本文的上面部分已經(jīng)詳細(xì)解釋了,也就是MySQL 查詢優(yōu)化器導(dǎo)致的。

其他的一些原則請大家還是要去看下索引的原理和查詢的基本原則,如果沒有前面的鋪墊,這些看起來似乎有些空洞。所以請大家在索引這一塊一定要循序漸進(jìn)的學(xué)習(xí),這一塊基本也是我們平時(shí)在使用MySQL時(shí)候的一些核心知識(shí)點(diǎn)了。

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2024-01-05 14:20:55

MySQL索引優(yōu)化器

2022-11-04 18:28:31

數(shù)倉建模大數(shù)據(jù)

2017-11-14 11:28:49

程序員索引數(shù)據(jù)

2018-04-09 14:25:06

數(shù)據(jù)庫MySQL索引

2020-12-09 10:10:24

MySQL數(shù)據(jù)庫算法

2020-10-12 18:00:39

JavaAQS代碼

2021-12-13 11:12:41

Spring事務(wù)失效

2022-06-27 07:23:44

MySQL常量優(yōu)化

2023-02-03 07:24:49

雙親委派模型

2022-10-17 00:04:30

索引SQL訂單

2010-11-29 10:22:46

Sybase建立索引

2025-11-26 08:21:31

2020-12-02 08:30:46

MySQL索引哈希表

2025-05-28 00:00:01

MySQL場景索引

2023-03-17 16:47:23

索引開發(fā)大數(shù)據(jù)

2023-06-30 07:58:07

Spring數(shù)據(jù)源事務(wù)

2022-02-28 08:55:31

數(shù)據(jù)庫MySQL索引

2024-12-11 08:09:54

2020-09-29 15:24:07

面試數(shù)據(jù)結(jié)構(gòu)Hashmap

2023-02-17 08:02:45

@Autowired@Resource
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久久精品女人| 欧美日韩伦理在线免费| 成人欧美一区二区三区| 视频在线99re| 99成人超碰| 国产成人在线播放| 久久精品66| 亚洲四色影视在线观看| h视频网站在线观看| 亚洲视频免费观看| 亚洲老女人av| 久久久精品日韩欧美| 鲁一鲁一鲁一鲁一澡| 国产不卡视频在线观看| 成人免费看片视频在线观看| 六月丁香婷婷色狠狠久久| 欧美一区二区三区电影在线观看| 国产精品扒开腿做爽爽爽软件| 成人福利在线视频| 亚洲91精品| 鬼打鬼之黄金道士1992林正英| 免费精品国产的网站免费观看| 欧美激情videos| 成人资源在线| 国产97人人超碰caoprom| 亚洲成人一品| 国产女精品视频网站免费| 成人一区二区| 99热最新在线| 日韩国产欧美三级| 日韩在线视频在线| 久久久久久亚洲综合| 一本岛在线视频| 亚洲老妇xxxxxx| 十九岁完整版在线观看好看云免费| 色诱视频网站一区| 中文字幕免费高清电视剧网站在线观看| 日韩一区二区三区电影在线观看 | 久久久精品麻豆| 久久久.com| 伊人精彩视频| 欧美视频精品在线观看| sm国产在线调教视频| 日韩精品中文字幕久久臀| 日本精品在线一区| 17婷婷久久www| 伊人色**天天综合婷婷| 精品一区二区国产| 国产福利精品导航| 国产经典第一页| 色激情天天射综合网| 密臀av在线| 爱福利视频一区| 精品成av人一区二区三区| 粉嫩精品一区二区三区在线观看 | 国产黄色片在线播放| 欧美sm极限捆绑bd| 精品中文字幕一区二区三区| 国产99视频在线观看| 国产日韩专区| 黄色片一级视频| 在线视频一区二区三区| 日韩欧美另类一区二区| 日韩美女激情视频| 国产在线观看精品一区| 欧美在线视频网| 免费欧美激情| 国产欧美欧洲| 国产福利不卡视频| 永久免费的av网站| 在线观看91精品国产麻豆| 怡红院成人在线| 日韩av观看网址| 亚洲精选久久| 美女黄色免费看| 精品久久久久久中文字幕| 青春草视频在线| 九九热视频这里只有精品| 99re66热这里只有精品8| 亚洲综合色丁香婷婷六月图片| 91在线最新| 亚洲精品国产欧美| 精品视频免费| 国产乱子伦精品视频| 午夜精品123| 成人在线视频观看| www 成人av com| 久久婷婷国产综合精品青草| 成年人在线观看| gogo大胆日本视频一区| 黄页网址大全在线观看| 亚洲成人精品视频在线观看| 天海翼亚洲一区二区三区| 麻豆蜜桃91| 一区二区在线电影| 成人欧美大片| 国产99午夜精品一区二区三区| 国产亚洲欧美中文| 日韩另类在线| 国产啪精品视频| 2021国产精品久久精品| 永久免费网站在线| 国产日韩在线亚洲字幕中文| 岛国av在线一区| 成人三级网址| 成人深夜直播免费观看| 国产日韩亚洲欧美综合| 成人女同在线观看| 成人精品网站在线观看| 国产视频一区在线播放| 深夜成人在线| 久久久久九九九| 欧美性黄网官网| 欧美a一欧美| 久久9精品区-无套内射无码| 欧美成人高清电影在线| 欧美久久成人| 五月天婷婷综合社区| 久久久久久久av| 91麻豆123| 国产成人免费精品| 麻豆视频传媒入口| 亚洲国产精品网站| 久久国产高清| 黄色网页在线观看| 成人免费aaa| 精品亚洲va在线va天堂资源站| 精品理论电影| 91热这里只有精品| 色悠悠国产精品| 91免费国产精品| 精品国产乱码久久久久久虫虫漫画 | 免费看毛片的网址| 欧美videofree性高清杂交| 亚洲综合精品| 国产在线观看a| 九色91在线视频| 3751色影院一区二区三区| 欧美 日韩 国产一区二区在线视频 | 欧美午夜无遮挡| 五月激情综合| caoporn国产精品免费视频| 国产精品毛片一区视频| 欧美日韩你懂得| 肉色丝袜一区二区| av资源亚洲| 日韩视频免费在线播放| 欧美野外猛男的大粗鳮| 一本色道久久加勒比精品| 在线一区视频| 一区二区精品伦理...| 国产原创popny丨九色| 久久久久久国产精品三级玉女聊斋| 亚洲天堂2014| 欧美a级一区| 国产盗摄在线视频网站| 国产乱子伦精品视频| 欧美高清视频在线| 亚洲高清视频的网址| 精品成人久久| 日韩在线影院| 成人女人a毛片在线看| 国产精品一区二区三| 91麻豆精品国产无毒不卡在线观看 | 欧美二区乱c黑人| 亚洲一二三四在线观看| 激情丁香综合| 日韩经典一区| 秋霞福利视频| 亚洲图片欧美激情| 欧美区国产区| 毛片免费看不卡网站| a视频免费看| 欧美精品人人做人人爱视频| 一区二区三欧美| 亚洲黄色小视频| 久久成人免费| 玖玖玖电影综合影院| 欧美孕妇性xxxⅹ精品hd| 中文字幕中文字幕在线中心一区 | 麻豆免费在线| 日本人视频jizz页码69| 99久久99久久精品国产片| 精品亚洲夜色av98在线观看| 亚洲情趣在线观看| 久久久噜噜噜久久狠狠50岁| 日韩精品中文字幕吗一区二区| 日本成人一区二区三区| 99热这里只有精品7| 国产精品www色诱视频| 亚洲高清色综合| 亚洲成av人片在线| 国产精品911| 欧美午夜不卡| 一区二区三区四区视频免费观看| 日本激情在线观看| 4hu永久免费入口| 国产激情片在线观看| 91免费版网站在线观看| 欧美人在线视频|