日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

jedis取存 数据库查到的对象_Mysql数据库索引BAT面试必问

發布時間:2025/3/21 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jedis取存 数据库查到的对象_Mysql数据库索引BAT面试必问 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.你能說說什么是索引嗎?

在關系數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的作用相當于圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。

2.索引具體采用的哪種數據結構呢?

常見的MySQL主要有兩種結構:Hash索引和B+ Tree索引,我們使用的是InnoDB引擎,默認的是B+樹

3.既然提到InnoDB使用的B+ 樹的索引模型,那么你知道為什么采用B+ 樹嗎?這和Hash索引比較起來有什么優缺點嗎?

一般來說,索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲在磁盤上,這樣,索引查找過程中就要產生磁盤IO消耗。因此,選擇數據結構時,索引的結構組織要盡量減少查找過程中磁盤IO的存取次數。 磁盤預讀可以通過IO效率(局部性原理),預讀的長度一般為頁的整數倍。數據庫系統巧妙利用了磁盤預讀原理,將一個節點的大小設為一個頁,這樣每個節點只需要一次IO就可以完全載入。每次新建節點時,直接申請一個頁的空間,這樣就保證了一個節點物理上也存儲在一個頁,加之計算機存儲分配都是按頁對齊的,就實現了一個節點只需要一次IO。 B樹中一次檢索最多需要h-1次IO(根節點常駐內存),漸進復雜度為O(h)=O(logdN)。一般應用中,出度d是非常大的數字,因此h非常小(通常不超過3)。紅黑樹這種結構,h明顯要深的多,由于邏輯上很近的節點(父子)物理上可能很遠,無法利用局部性。紅黑樹的IO漸進復雜度也為O(h),效率明顯比B樹差很多。

B+樹更適合外索引,原因和內節點出度d有關,d越大索引性能越好,而出度的上線取決于節點內key和data的大小,由于B+樹內節點去掉了data域,因此可以擁有更大的出度,擁有更好的性能。dmax = floor(pagesize / (keysize + datasize + pointsize)) (pagesize – dmax >= pointsize)

和Hash索引比較

1) Hash索引哈希索引適合等值查詢,不適合范圍查找,而B+樹特別適合范圍查找(特別是聚簇索引的時候)

2)Hash索引每次查詢要加載所有的索引數據到內存當中,哈希索引沒辦法利用索引完成排序 ,而B+樹只需要根據匹配規則選擇對應的葉子數據加載即可

3)另外B+樹引入了緩存機制 和 數據頁技術來提升性能(不過理論上來說,這兩個特性Hash索引也可以實現)

4)如果有大量重復鍵值的情況下,哈希索引的效率會很低,因為存在哈希碰撞問題

4.B+ Tree的葉子節點都可以存哪些東西?以及區別?

InnoDB的B+ Tree可能存儲的是整行數據,也有可能是主鍵的值;

在 InnoDB 里,索引B+ Tree的葉子節點存儲了整行數據的是主鍵索引,也被稱之為聚簇索引。而索引B+ Tree的葉子節點存儲了主鍵的值的是非主鍵索引,也被稱之為非聚簇索引;

聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲并不連續聚集索引:物理存儲按照索引排序;

聚集索引是一種索引組織形式,索引的鍵值邏輯順序決定了表數據行的物理存儲順序。非聚集索引:物理存儲不按照索引排序;

非聚集索引則就是普通索引了,僅僅只是對數據列創建相應的索引,不影響整個表的物理存儲順序。

索引是通過二叉樹的數據結構來描述的,我們可以這么理解聚簇索引:索引的葉節點就是數據節點。而非聚簇索引的葉節點仍然是索引節點,只不過有一個指針指向對應的數據塊。

優勢與缺點:

聚集索引插入數據時速度要慢(時間花費在“物理存儲的排序”上,也就是首先要找到位置然后插入),查詢數據比非聚集數據的速度快。

5.聚簇索引查詢會更快,為什么?

因為主鍵索引樹的葉子節點直接就是我們要查詢的整行數據了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值以后,還需要再通過主鍵的值再進行一次查詢;

6. 剛剛你提到主鍵索引查詢只會查一次,而非主鍵索引需要回表查詢多次。(這個過程叫做回表)是所有情況都是這樣的嗎?非主鍵索引一定會查詢多次嗎?

覆蓋索引(covering index)指一個查詢語句的執行只用從索引中就能夠取得,不必從數據表中讀取。也可以稱之為實現了索引覆蓋。

當一條查詢語句符合覆蓋索引條件時,MySQL只需要通過索引就可以返回查詢所需要的數據,這樣避免了查到索引后再返回表操作,減少I/O提高效率。

如,表covering_index_sample中有一個普通索引 idx_key1_key2(key1,key2)。

當我們通過SQL語句:select key2 from covering_index_sample where key1 = 'keytest';的時候,就可以通過覆蓋索引查詢,無需回表。

7.創建索引需要考慮哪些因素

1)非空字段:應該指定列為NOT NULL,因為含有空值的列很難進行查詢優化,因為他們使得索引、索引的統計信息以及比較運算更加復雜

2)取值離散大的字段

3)索引字段越小越好:數據庫的數據存儲以頁為單位,一頁存儲的數據越多,一次IO操作獲取的數據越大,效率越高

4)建立索引的時機:若表中的某字段出現在select、過濾、排序條件中,為該字段建立索引是值得的。5)對于like '%xxx'的模糊查詢,普通的索引是無法滿足的,需要建立全文索引。 6)對于有多個條件的,比如: "...where a=xxx and b=yyy","...where a=xxx order by b","...where a=xxx group by b"。需要使用組合索引。但是組合索引只能在SQL語句中滿足"最左前綴"的條件下使用。且組合索引有一些副作用,如索引尺寸可能比數據本身大,因為組合索引的組合條目多。所以在實際應用中,要量身定做,使用慢查詢分析工具分析。 7)開啟索引緩存,直接在內存中查找索引,不用再磁盤中。8)建立索引是有代價的,當update、delete語句執行時,會使得索引更新,將耗掉更多的時間。可以使用mysqlreport報告,了解select、update、delete、insert、replace各語句所占的百分比。

9)表的數據量,一般實際開發中20W以上數據我們考慮索引

8.索引的規則:(在MySQL 5.6中,對索引做了哪些優化嗎,主要是索引下推)

  • 覆蓋索引:普通索引的葉子節點存儲的是主鍵值,如果要查詢的內容不止是主鍵值,需要回表操作,即得到主鍵值之后還需要到主鍵索引進行查找得到記錄值
  • 最左前綴原則:利用最左前綴原則為最常用查詢創建索引,來減少索引的個數,從而減少mysql開銷
  • 索引下推:mysql5.6之后引入了索引下推優化,相當于對聯合索引做了查詢優化,減少了回表操作,即對索引種包含的字段先做判斷,直接過濾掉不滿足條件的記錄。
  • 普通索引在命中記錄后,會查找下一個,直到找到不滿足條件的記錄,而唯一索引在命中后直接返回
  • 普通索引的更新會使用change buffer緩存結果,而不是每次更改都寫入磁盤,因此對于時效不強的數據盡可能使用普通索引而非唯一索引
  • 9.排查的時候,有什么手段可以知道有沒有走索引查詢呢

    通過explain查看sql語句的執行計劃,通過執行計劃來分析索引使用情況

    10.什么情況下會發生明明創建了索引,但是執行的時候并沒有通過索引呢?

    查詢優化器?

    一條SQL語句的查詢,可以有不同的執行方案,至于最終選擇哪種方案,需要通過優化器進行選擇,選擇執行成本最低的方案。

    在一條單表查詢語句真正執行之前,MySQL的查詢優化器會找出執行該語句所有可能使用的方案,對比之后找出成本最低的方案。

    這個成本最低的方案就是所謂的執行計劃。優化過程大致如下:

    1、根據搜索條件,找出所有可能使用的索引

    2、計算全表掃描的代價

    3、計算使用不同索引執行查詢的代價

    4、對比各種執行方案的代價,找出成本最低的那一個

    11.索引的優化策略:

  • 對于較長字符串的列的查詢,可以考慮使用mysql5.7引入的虛擬列來創建索引
  • 對于雙M主備結構,auto_increment_increment可以都設置為2,一個寫奇數一個寫偶數,防止兩個庫的主鍵沖突
  • 寫入較多的情況下,主鍵數據類型可以設置為big int,有8個字節,上限可以到達264-1
  • 對于比較大的表做查詢,可以考慮使用臨時表,然后給臨時表創建索引
  • 對于字符串字段可以創建前綴索引來節省空間,前綴長度可以使用count(distinct)來判斷,盡可能高區分度
  • 對于區分度不打的字符串,可以考慮使用逆序存儲或者hash值索引,這種方法僅適用等值查找,范圍掃描會導致全索引掃描
  • 有時mysql的優化器會選錯索引,可以使用force index來強制指定索引,也可以通過修改語句來引導優化器,當然也可以直接增加或刪除索引來避免,也可以使用analyze table [表名]重新統計索引信息后再執行
  • 在使用join時要使用被驅動表的索引(使用了NLJ算法),盡可能讓小表(滿足條件的數據量相對較小的表)做驅動表,因為被驅動表的索引查找可以最大限度減少查詢次數
  • explain看到join語句的Extra中有Block Nested Loop(BNL)時表示被驅動表做了全表掃描,要避免這種寫法,如果無法避免,則join_buffer_size可以設大一點讓驅動表的數據可以加載多一點,從而減少被驅動表全表掃描的次數(因為join_buffer一次放不下驅動表數據時,會分多次裝入后跟被驅動表的全表數據做對比)
  • 12.索引的鎖機制

  • 默認加鎖的基本單位是next-key鎖,next-key鎖本身是前開后閉的
  • 查找過程中訪問到的對象才會加鎖,訪問到就會加鎖
  • 索引上的等值查詢,給唯一索引加鎖時,next-key會退化為行鎖(innodb)
  • 索引上的等值查詢,向右遍歷且最后一個值不滿足等值條件時,next-key會退化為區間鎖(前開后開)
  • 索引默認向后遍歷,如果有order by … desc字段要求逆序排列,則會從后向前遍歷
  • 總結

    以上是生活随笔為你收集整理的jedis取存 数据库查到的对象_Mysql数据库索引BAT面试必问的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美日韩人妻精品一区 | 日韩精品自拍偷拍 | 日韩av在线一区二区三区 | 花样视频污 | 91一区二区视频 | 黄色av电影网址 | 国产精品一区二区在线免费观看 | 午夜男人的天堂 | 操丝袜少妇 | 成av在线| 日日拍拍| 成人高清在线 | 夜夜操天天爽 | 黑巨茎大战欧美白妞 | 亚洲第一色网 | 日本暧暧视频 | 不卡的在线视频 | 视频免费观看在线 | 国产一区二区网址 | 伊人日韩 | 人妻一区在线 | 五月婷婷综合久久 | 久久精品男人的天堂 | 国产精品国产三级国产三级人妇 | 国产午夜精品无码 | 欧美做受高潮1 | 91精品婷婷国产综合久久 | 一级做a爱片性色毛片 | 午夜久久精品 | 免费淫片 | 中文字幕乱码在线人视频 | 国产一区二区三区黄片 | 午夜久久久久久久久久久 | 日韩电影三级 | 黄色小视频免费看 | 97精品人妻一区二区 | 欧美老少做受xxxx高潮 | 国产视频一二三 | 午夜秋霞影院 | 国产av不卡一区二区 | www.xxxx欧美| 亚洲午夜精品一区二区三区 | 狠狠干伊人 | 欧美女优一区二区 | 欧美日韩加勒比 | 色花堂在线 | 国产精品高清在线 | 亚洲精品免费av | 国产美女视频 | 免费看美女隐私网站 | 在线精品免费视频 | 娇小萝被两个黑人用半米长 | av鲁丝一区鲁丝二区鲁丝三区 | 国产色在线,com | 五月婷婷影院 | 亚洲午夜福利在线观看 | 97精品人妻一区二区三区蜜桃 | 免费看h网站 | 精品一区二区久久久久久久网站 | 播播激情网 | 香蕉国产片 | 浪潮av一区二区三区 | 国产一级爱| 色欲久久久天天天综合网精品 | 高清av一区二区三区 | 国产suv精品一区二区 | 中日韩毛片 | 天堂国产在线 | 日韩欧美精品一区二区三区 | 妺妺窝人体色www在线小说 | 午夜av网 | 亚洲免费av电影 | 爱情岛论坛自拍亚洲品质极速最新章 | 五月婷网站 | 久久久久亚洲日日精品 | 蜜桃久久久久 | 亚洲精品日韩丝袜精品 | 人操人操 | 国产强被迫伦姧在线观看无码 | 就是色 | 一级欧美在线 | 国模无码大尺度一区二区三区 | 无码少妇一区二区三区芒果 | 亚洲天堂av影院 | 亚洲福利一区 | 欧美视频一区二区三区 | www.猫咪av.com| 久久综合久 | 国产成人免费在线视频 | 黄色片在线免费观看视频 | av观看国产| 中文在线字幕免费观看电 | 日本伦理片在线播放 | 亚洲逼 | 国产处女 | 打屁股外国网站 | 青娱乐国产视频 | 精品久久久久久一区二区里番 | 成人在线观看网站 |