C/C++工程師面試題(數據庫篇)

索引的優缺點

索引是一種支持快速查找特定行的數據結構,如果沒有索引,就需要遍歷整個表進行查找。用于提高數據檢索的速度和效率。

好處:

  1. 提高檢索速度: 索引可以加快數據的檢索速度,因為它們允許數據庫系統直接定位到存儲數據的位置,而不必遍歷整個數據表。

  2. 優化數據訪問路徑: 索引可以優化數據訪問路徑,使得查詢更加高效。

壞處:

  1. 占用存儲空間: 索引會占用額外的存儲空間,特別是對于大型數據集來說,索引可能會占用相當大的空間。

  2. 影響寫操作的性能: 當執行插入、更新和刪除等寫操作時,數據庫系統需要更新索引,這可能會影響寫操作的性能。

  3. 維護成本高昂: 維護索引需要額外的系統資源和時間成本。隨著數據庫的增長和索引的數量增加,維護成本可能會變得很高。

數據庫索引的底層數據結構

B+樹。在數據庫中,B+樹的高度一般都在2~4層,效率很高。

B+樹中,所有記錄節點都是按鍵值的大小順序存放在同一層的葉子節點,各葉子節點通過指針進行鏈接。

非葉子節點只存儲與搜索有關的key

葉子節點存儲數據。從小到大有序,并且使用指針連接在一起。

B+樹索引在數據庫中的一個特點就是高扇出性。B-tree將數據庫拆分成了固定大小的塊,通常為4K,塊是內部讀寫的最小單元。這種設計更接近底層硬件,因為磁盤也是以固定大小的塊排列的。
問題:如果固定大小的塊已經滿了該怎么辦、

答案:分裂多個塊解決,空的空間使用空閑空間。

聚簇索引和非聚簇索引

兩者主要區別是數據和索引是否分離。

  • 聚簇索引是將數據與索引存儲到一起,找到索引也就找到了數據;
    葉子節點存儲真實數據
    非葉子節點存儲查詢需要的key
    一個表有且僅有一個聚簇索引,并且該索引是建立在主鍵上的,如果沒有主鍵,會建立在unique列上
  • 而非聚簇索引是將數據和索引存儲分離開,索引樹的葉子節點存儲了數據行的地址。
    其他索引項都是非聚簇索引
    葉子節點存儲聚簇索引的key
    非葉子節點存儲查詢需要的key
    查找會先找到葉子節點,拿葉子節點的聚簇索引的key再去搜索聚簇索引

索引為什么不用哈希表而用 B+ 樹

哈希表的查詢效率的確最高,時間復雜度O(1),但是它要求將所有數據載入內存,而數據庫存儲的數據量級可能會非常大,全部載入內存基本上是不可能實現的

索引為什么不用紅黑樹而用 B+ 樹

索引的底層用的并不是二叉樹紅黑樹。因為二叉樹和紅黑樹在某些場景下都會暴露出一些缺陷。
二叉樹:在某些場景下會退化成鏈表,而鏈表的查找需要從頭部開始遍歷,而這就失去了加索引的意義。
紅黑樹:當數據表很多時,會導致索引樹的層數很高。索引從根節點開始查找,而如果我們需要查找的數據在底層的葉子節點上,那么樹的高度是多少,就要進行多少次查找,并且數據存在磁盤上,訪問還需要進行磁盤IO,這會導致效率過低。

提高查詢效率的方法

提高查詢效率的方法有很多,以下是一些常見的方法:

  1. 索引優化: 通過在經常查詢的列上創建索引,可以加快查詢速度。

  2. 優化查詢語句: 編寫高效的查詢語句是提高查詢效率的關鍵。避免使用SELECT *,只選擇需要的列;避免使用不必要的子查詢等。

  3. 內存緩存: 使用緩存技術將熱點數據存儲在內存中,可以減少數據庫訪問次數,提高查詢速度。

  4. 合適的數據類型: 使用合適的數據類型可以減少存儲空間并提高查詢效率。例如,選擇整數型而不是字符串型存儲數字數據。

  5. 定期優化數據庫: 定期清理無用數據、重建索引以及收集統計信息等可以提高數據庫性能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716642.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716642.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716642.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Revit-二開之立面視圖創建FilledRegion-(3)

在上一篇博客中介紹了FilledRegion的創建方法,這種方法通常只在平面視圖中適用,在三維視圖中也是無法創建的(目前研究的是這樣的,如果有其他方法,請賜教)。 本片文章介紹一個下在立面視圖中創建FilledRegion的方法,主要操作是在立面視圖中拾取一個點,然后以該點為原點,…

YOLOv5 項目:推理代碼和參數詳細介紹(detect)

1、前言 本章將介紹yolov5項目的推理函數,關于yolov5的下載和配置環境,參考上一篇文章: YOLOv5 項目:環境配置-CSDN博客 pycharm 中打開的推理模塊如紅框中所示 pycharm將conda新建的虛擬環境導入,參考 :…

快速模冪(c++題解)

題目描述 試求ab%n的值,其中a、b、n均為整數范圍內的數。 輸入格式 三個整數即a、b、n。 輸出格式 輸出結果。 樣例 樣例輸入 復制1 1 1樣例輸出 復制0 _____________________________________________________________________________ ok呀總算學到一個…

從 AI 的爆火聊聊用戶界面(UI)的演進

目錄 用戶界面的起源與發展 用戶界面的設計原則與趨勢 用戶界面未來的方向 小結 用戶界面(User Interface,簡稱 UI)是人與計算機系統交互的媒介,用戶可以通過用戶界面向計算機發送指令,同時計算機可以通過用戶界面…

面試 Java 基礎八股文十問十答第十五期

面試 Java 基礎八股文十問十答第十五期 作者:程序員小白條,個人博客 相信看了本文后,對你的面試是有一定幫助的!關注專欄后就能收到持續更新! ?點贊?收藏?不迷路!? 1)BIO, NIO, AIO 有什么…

簡單實現Transformer的自注意力

簡單實現Transformer的自注意力 關注{曉理紫|小李子},獲取技術推送信息,如感興趣,請轉發給有需要的同學,謝謝支持!! 如果你感覺對你有所幫助,請關注我。 源碼獲取:VX關注并回復chatg…

二叉樹的右視圖,力扣

目錄 題目: 我們直接看題解吧: 快速理解解題思路小建議: 審題目事例提示: 解題方法: 解題分析: 解題思路: 代碼實現(DFS): 代碼1: 補充說明: 代碼2&#xff1…

Vue.js中的$nextTick

其實目前在我現有的開發經歷中,我還沒有實際運用過$nextTick,今天在看書時,學習到了這個東西,所以做個筆記記錄一下。 一、$nextTick是什么? $nextTick 是 Vue提供的一個方法,用于在 DOM 更新之后執行回調…

AI:148-開發一種智能語音助手,能夠理解和執行復雜任務

??點擊這里跳轉到本專欄,可查閱專欄頂置最新的指南寶典~ ?????? 你的技術旅程將在這里啟航! 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶關鍵代碼,詳細講解供大家學習,希望…

淺談鉤子方法

何為鉤子方法 鉤子方法(Hook methods)是一種在面向對象編程中常用的設計模式,也被稱為模板方法模式。在這種模式中,父類定義了一個算法的框架,并且將一些步驟的實現延遲到子類中。子類可以通過重寫這些“鉤子方法”來改…

[技巧]Arcgis之圖斑四至點批量計算

前言 上一篇介紹了arcgis之圖斑四至范圍計算,這里介紹的圖斑四至點的計算及獲取,兩者之間還是有差異的。 [技巧]Arcgis之圖斑四至范圍計算 這里說的四至點指的是圖斑最東、最西、最南、最北的四個地理位置點坐標,如下圖: 四至點…

青山隱隱,敗葉蕭蕭

給定序列需滿足二個條件:本身是質數,相鄰二項之和仍為質數 首先一個偶數2*n不能通過2*k(k取整數)得到質數。 奇數2*n-12*k2*(nk)-1,可能得到質數 那么若序列中存在偶數,一定不滿足第一個條件(特判0,2&am…

STM32進階筆記——復位、時鐘與滴答定時器

本專欄爭取每周三更新直到更新完成,期待大家的訂閱關注,歡迎互相學習交流。 目錄 一、復位1.1 軟件復位1.2 低功耗管理復位 二、時鐘2.1 系統時鐘(SYSCLK)選擇2.2 系統時鐘初始化 三、滴答定時器(Systick)3.1 SysTick部分寄存器3.…

部署bpmn項目實現activiti流程圖的在線繪制

本教程基于centos7.6環境中完成 github開源項目: https://github.com/Yiuman/bpmn-vue-activiti軟件:git、docker 1. 下載源代碼 git clone https://github.com/Yiuman/bpmn-vue-activiti.git2. 修改Dockerfile文件 聲明基礎鏡像,將項目打包&#xff…

EasyRecovery數據恢復軟件有什么優勢呢?

EasyRecovery數據恢復軟件具有以下優勢: 強大的恢復能力:EasyRecovery采用先進的掃描和恢復技術,能夠深度掃描存儲設備,尋找并恢復因各種原因丟失的數據。無論是誤刪除、格式化、分區損壞還是病毒感染,它都能提供有效…

設計模式(十一)策略模式

請直接看原文:設計模式(十一)策略模式_某移動支付系統在實現賬戶資金轉入和轉出時需要進行身份驗證,該系統為用戶提供了-CSDN博客 ----------------------------------------------------------------------------------------------------------------…

LeetCode01 - 35.搜索插入位置

一、題目要求 給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。 請必須使用時間復雜度為 O(log n) 的算法 示例 1: 輸入: nums [1,3,5,6], target 5 輸出: 2示…

SpringMVC 學習(十一)之數據校驗

目錄 1 數據校驗介紹 2 普通校驗 3 分組校驗 4 參考文檔 1 數據校驗介紹 在實際的項目中,一般會有兩種校驗數據的方式:客戶端校驗和服務端校驗 客戶端校驗:這種校驗一般是在前端頁面使用 JS 代碼進行校驗,主要是驗證輸入數據…

文物預防性保護系統方案的需求分析

沒有文物保存環境監測,就不能實施有效的文物預防性保護。因此要建立文物預防性保護體系,一定要先有良好的文物狀態監測制度,進而進行科學有效的文物保護管理。所以,導入文物預防性保護監測與調控系統,首先就是要針對文物進行全年溫度、濕度、光照等關鍵參…

使用Zint庫生成一維碼/條形碼

下面代碼是是使用 Zint 庫生成 Code 128 類型的條形碼&#xff0c;并將生成的條形碼保存為 output.bmp 文件。下面是對代碼的詳細解釋&#xff1a; #include 和 #include <zint.h>&#xff1a;這兩行代碼包含了所需的頭文件&#xff0c;分別是標準輸入輸出流的頭文件和 Z…