通過一分鐘快速了解索引技巧
花1分鐘時(shí)間,了解聚集索引,非聚集索引,聯(lián)合索引,索引覆蓋。
舉例,業(yè)務(wù)場(chǎng)景,用戶表,表結(jié)構(gòu)為:
t_user( uid primary key, login_name unique, passwd, login_time, age, … );
聚集索引(clustered index):聚集索引決定數(shù)據(jù)在磁盤上的物理排序,一個(gè)表只能有一個(gè)聚集索引,一般用primary key來(lái)約束。
舉例:t_user場(chǎng)景中,uid上的索引。
非聚集索引(non-clustered index):它并不決定數(shù)據(jù)在磁盤上的物理排序,索引上只包含被建立索引的數(shù)據(jù),以及一個(gè)行定位符row-locator,這個(gè)行定位符,可以理解為一個(gè)聚集索引物理排序的指針,通過這個(gè)指針,可以找到行數(shù)據(jù)。
舉例,查找年輕MM的業(yè)務(wù)需求:
select uid from t_user where age > 18 and age < 26;
age上建立的索引,就是非聚集索引。
聯(lián)合索引:多個(gè)字段上建立的索引,能夠加速?gòu)?fù)核查詢條件的檢索
舉例,登錄業(yè)務(wù)需求:
select uid, login_time from t_user where login_name=? and passwd=?
可以建立(login_name, passwd)的聯(lián)合索引。
聯(lián)合索引能夠滿足最左側(cè)查詢需求,例如(a, b, c)三列的聯(lián)合索引,能夠加速a | (a, b) | (a, b, c) 三組查詢需求。
這也就是為何不建立(passwd, login_name)這樣聯(lián)合索引的原因,業(yè)務(wù)上幾乎沒有passwd的單條件查詢需求,而有很多l(xiāng)ogin_name的單條件查詢需求。
提問:
select uid, login_time from t_user where passwd=? and login_name=?
能否命中(login_name, passwd)這個(gè)聯(lián)合索引?
回答:可以,最左側(cè)查詢需求,并不是指SQL語(yǔ)句的寫法必須滿足索引的順序(這是很多朋友的誤解)
索引覆蓋:被查詢的列,數(shù)據(jù)能從索引中取得,而不用通過行定位符row-locator再到row上獲取,即“被查詢列要被所建的索引覆蓋”,這能夠加速查詢速度。
舉例,登錄業(yè)務(wù)需求:
select uid, login_time from t_user where login_name=? and passwd=?
可以建立(login_name, passwd, login_time)的聯(lián)合索引,由于login_time已經(jīng)建立在索引中了,被查詢的uid和login_time就不用去row上獲取數(shù)據(jù)了,從而加速查詢。
末了多說(shuō)一句,登錄這個(gè)業(yè)務(wù)場(chǎng)景,login_name具備唯一性,建這個(gè)單列索引就好。
作業(yè):
假設(shè)訂單有三種狀態(tài):0已下單,1已支付,2已完成
業(yè)務(wù)需求,查詢未完成的訂單,哪個(gè)SQL更快呢?
select * from order where status!=2 select * from order where status=0 or status=1 select * from order where status IN (0,1) select * from order where status=0 union select * from order where stauts=1
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
數(shù)據(jù)分析數(shù)據(jù)庫(kù)ClickHouse在大數(shù)據(jù)領(lǐng)域應(yīng)用實(shí)踐
這篇文章主要為大家介紹了數(shù)據(jù)分析數(shù)據(jù)庫(kù)ClickHouse在大數(shù)據(jù)領(lǐng)域應(yīng)用實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04為什么你不要收縮數(shù)據(jù)庫(kù)文件(國(guó)外翻譯)
這幾天查看了很多關(guān)于SQL SERVER收縮數(shù)據(jù)文件方面的文章,準(zhǔn)備寫一篇關(guān)于收縮日志方面的文章,但是突然有種沖動(dòng)將看過經(jīng)典的文章翻譯出來(lái),需要的朋友可以參考下2018-03-03Navicat圖形化界面之Navicat?Premium?12?安裝與使用教程
Navicat?premium?是一款數(shù)據(jù)庫(kù)管理工具,它可以讓你以單一程式同時(shí)連線到?MySQL、SQLite、Oracle?及?PostgreSQL?資料庫(kù),讓管理不同類型的資料庫(kù)更加的方便,下面通過本文給大家介紹Navicat?Premium?12?安裝使用教程,需要的朋友參考下吧2021-12-12站內(nèi)群發(fā)消息三種不同用戶量的數(shù)據(jù)庫(kù)設(shè)計(jì)
很多SNS網(wǎng)站和一部分CMS網(wǎng)站都廣泛地應(yīng)用了站內(nèi)信這一模塊,這個(gè)看似簡(jiǎn)單的東西其實(shí)背后隱藏著很多需要設(shè)計(jì)師重視的設(shè)計(jì)細(xì)節(jié),要做好這個(gè)“郵遞員”是很不容易的,本文講述站內(nèi)群發(fā)消息三種不同用戶量的數(shù)據(jù)庫(kù)設(shè)計(jì),逐漸設(shè)計(jì)一個(gè)百萬(wàn)級(jí)用戶量的站內(nèi)信群發(fā)數(shù)據(jù)庫(kù)2023-12-12在PostgreSQL的基礎(chǔ)上創(chuàng)建一個(gè)MongoDB的副本的教程
這篇文章主要介紹了在PostgreSQL的基礎(chǔ)上創(chuàng)建一個(gè)MongoDB的副本的教程,使在使用NoSQL的同時(shí)又能用到PostgreSQL中的東西,需要的朋友可以參考下2015-04-04本機(jī)上實(shí)現(xiàn)neo4j遠(yuǎn)程連接方式
這篇文章主要介紹了本機(jī)上實(shí)現(xiàn)neo4j遠(yuǎn)程連接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02數(shù)據(jù)庫(kù)的設(shè)計(jì)方法、規(guī)范與技巧
數(shù)據(jù)庫(kù)的設(shè)計(jì)方法、規(guī)范與技巧...2007-03-03