最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

總結(jié)三道MySQL聯(lián)合索引面試題

 更新時間:2022年08月16日 10:17:00   作者:一燈架構(gòu)???????  
這篇文章主要介紹了總結(jié)三道MySQL聯(lián)合索引面試題,眾所周知MySQL聯(lián)合索引遵循最左前綴匹配原則,在少數(shù)情況下也會不遵循,創(chuàng)建聯(lián)合索引的時候,建議優(yōu)先把區(qū)分度高的字段放在第一列

前言:

眾所周知MySQL聯(lián)合索引遵循最左前綴匹配原則,在少數(shù)情況下也會不遵循(有興趣,可以翻一下上篇文章

創(chuàng)建聯(lián)合索引的時候,建議優(yōu)先把區(qū)分度高的字段放在第一列。

至于怎么統(tǒng)計區(qū)分度,可以按照下面這種方式。

創(chuàng)建一張測試表,用來測試:

CREATE TABLE `test` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `a` int NOT NULL,
  `b` int NOT NULL,
  `c` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='測試表';

統(tǒng)計每個字段的區(qū)分度:

select 
    count(distinct a)/count(*), 
    count(distinct b)/count(*),
    count(distinct c)/count(*)
from test;

值越大,區(qū)分度越高,優(yōu)先放在第一列。

很多人不知道聯(lián)合索引在B+樹中是怎么存儲的?我簡單畫一下。

比如在(a,b)字段上面創(chuàng)建聯(lián)合索引,存儲結(jié)構(gòu)類似下面這樣:

image.png

葉子節(jié)點存儲全部數(shù)據(jù),用雙鏈表指針相連,數(shù)據(jù)都是先按a字段排序,a字段的值相等時再按b字段排序。

a字段的值是全局有序的,分別有1,1,1,2,2,2。

b字段的值是全局無序的,分別有1,3,5,1,3,5,只有在a字段的值相等時才呈現(xiàn)出局部有序。

所以在進行SQL查詢的時候,如果where條件中沒有a字段,只有b字段,是無法用到索引的,像下面這樣:

select * from test where b=1;

像有些文章上面說的,在(a,b)兩個字段上創(chuàng)建聯(lián)合索引,就會創(chuàng)建兩個索引,分別是(a)和(a,b),這其實是一種不恰當(dāng)?shù)谋硎?,雖然結(jié)果是對的。

下面做幾道聯(lián)合索引的經(jīng)典面試題,試一下大家掌握的怎么樣?

第一題:

下面這條SQL,該怎么創(chuàng)建聯(lián)合索引?

SELECT * FROM test WHERE a = 1 and b = 1 and c = 1;

你以為的答案是(a,b,c),其實答案是6個,abc三個的排列組合,(a,b,c)、(a,c,b)、(b,a,c)、(b,c,a)、(c,a,b)、(c,b,a)。

MySQL優(yōu)化器為了適應(yīng)索引,會調(diào)整條件的順序。

再給面試官補充一句,區(qū)分度高的字段放在最前面,大大加分。

第二題:

下面這條SQL,該怎么創(chuàng)建聯(lián)合索引?

SELECT * FROM test WHERE a = 1 and b > 1 and c = 1;

考察的知識點是: 聯(lián)合索引遇到范圍匹配會停止,不會再匹配后面的索引字段。

所以答案應(yīng)該是:(a,c,b)和 (c,a,b)。

當(dāng)創(chuàng)建(a,c,b)和 (c,a,b)索引的時候,查詢會用到3個字段的索引,效率更高。

怎么判斷是用到了3個字段的索引,而不是只用到前兩個字段的索引呢?

有個非常簡單的方法,看執(zhí)行計劃的索引長度。

由于int類型的字段占4個字節(jié),3個字段長度剛好是12個字節(jié)。

第三題:

下面這條SQL,該怎么創(chuàng)建聯(lián)合索引?

SELECT * FROM test WHERE a in (1,2,3) and b > 1;

答案是(a,b)。in條件查詢會被轉(zhuǎn)換成等值查詢,可以驗證一下:

可以看到用到了兩個字段的索引。

所以我們在平時做開發(fā),盡量想辦法把范圍查詢轉(zhuǎn)換成in條件查詢,效率更高。

到此這篇關(guān)于總結(jié)三道MySQL聯(lián)合索引面試題的文章就介紹到這了,更多相關(guān)MySQL聯(lián)合索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySql 5.7.17 winx64的安裝配置詳細(xì)教程

    MySql 5.7.17 winx64的安裝配置詳細(xì)教程

    這篇文章主要介紹了MySql 5.7.17 winx64的安裝配置教程,初始化數(shù)據(jù)庫、配置相關(guān)信息的方法在本文中介紹的非常詳細(xì),需要的朋友參考下
    2017-01-01
  • mysql查詢慢的原因和解決方案

    mysql查詢慢的原因和解決方案

    最近發(fā)現(xiàn)公司網(wǎng)站后臺查詢的時候比較慢,可能因為大量的like查詢導(dǎo)致,這里為大家分享一下方法,需要的朋友可以參考下
    2019-09-09
  • mysql免安裝版1067錯誤終極解決辦法圖文教程

    mysql免安裝版1067錯誤終極解決辦法圖文教程

    這篇文章主要介紹了mysql免安裝版1067錯誤終極解決辦法圖文教程,從筆記本到pc端。本文給大家介紹的非常詳細(xì),需要的朋友參考下
    2017-01-01
  • 通過SqlCmd執(zhí)行超大SQL文件的方法

    通過SqlCmd執(zhí)行超大SQL文件的方法

    這篇文章主要介紹了sql?server?與?mysql?中常用的SQL語句區(qū)別,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • 詳解Mysql取前一天、前一周、后一天等時間函數(shù)

    詳解Mysql取前一天、前一周、后一天等時間函數(shù)

    本文給大家介紹Mysql取前一天、前一周、后一天等時間函數(shù),本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • mysql多版本并發(fā)控制MVCC的實現(xiàn)

    mysql多版本并發(fā)控制MVCC的實現(xiàn)

    這篇文章主要介紹了mysql多版本并發(fā)控制MVCC的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 一文搞定MySQL binlog/redolog/undolog區(qū)別

    一文搞定MySQL binlog/redolog/undolog區(qū)別

    這篇文章主要介紹了一文搞定MySQL binlog/redolog/undolog區(qū)別,作為開發(fā),我們重點需要關(guān)注的是二進制日志(binlog)和事務(wù)日志(包括redo log和undo log),本文接下來會詳細(xì)介紹這三種日志,需要的朋友可以參考下
    2023-04-04
  • MySQL性能參數(shù)詳解之Skip-External-Locking參數(shù)介紹

    MySQL性能參數(shù)詳解之Skip-External-Locking參數(shù)介紹

    MySQL的配置文件my.cnf中默認(rèn)存在一行skip-external-locking的參數(shù),即跳過外部鎖定。根據(jù)MySQL開發(fā)網(wǎng)站的官方解釋,External-locking用于多進程條件下為MyISAM數(shù)據(jù)表進行鎖定
    2016-05-05
  • IDEA鏈接MySQL報錯08001和連接成功后不顯示表的問題及解決方法

    IDEA鏈接MySQL報錯08001和連接成功后不顯示表的問題及解決方法

    這篇文章主要介紹了IDEA鏈接MySQL報錯08001和連接成功后不顯示表的問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • MySQL:reading initial communication packet問題解決方法

    MySQL:reading initial communication packet問題解決方法

    網(wǎng)站訪問出現(xiàn)如題錯誤,經(jīng)過檢查my.cnf,發(fā)現(xiàn)innodb_buffer_pool_size = 2048M 設(shè)置過大,調(diào)整為innodb_buffer_pool_size = 1024M即可,網(wǎng)上也有該問題的其他解決方法,但都不能解決我的問題
    2012-07-07

最新評論

郴州市| 泊头市| 尚义县| 高陵县| 泰州市| 桓台县| 郧西县| 山阴县| 松原市| 通州市| 石河子市| 修武县| 清原| 旬邑县| 远安县| 潢川县| 泸水县| 会昌县| 永顺县| 泸西县| 固镇县| 茂名市| 芒康县| 叶城县| 茂名市| 祁东县| 澳门| 新蔡县| 高青县| 西青区| 临沭县| 柳江县| 庆安县| 靖西县| 七台河市| 报价| 日照市| 大连市| 齐齐哈尔市| 道真| 博爱县|