【Java面試】這道互聯網高頻面試題難住了80%的程式員?索引什麼時候失效?

来源:https://www.cnblogs.com/mic112/archive/2022/08/06/16557263.html
-Advertisement-
Play Games

“索引什麼時候失效?” 面試過程中,突如其來的一個問題,是不是有點懵? 沒關係,關註我,面試不迷路。 我是Mic,一個工作了14年的Java程式員。 索引失效涉及到的知識點非常多,所以我把這個問題的回答整理到了一個20W字的面試文檔裡面,大家可以領取。 下麵看看高手的回答 高手: InnoDB引擎里 ...


“索引什麼時候失效?”

面試過程中,突如其來的一個問題,是不是有點懵?

沒關係,關註我,面試不迷路。

我是Mic,一個工作了14年的Java程式員。

索引失效涉及到的知識點非常多,所以我把這個問題的回答整理到了一個20W字的面試文檔裡面,大家可以領取。

下麵看看高手的回答

高手:

InnoDB引擎裡面有兩種索引類型,一種是主鍵索引、一種是普通索引。

InnoDB用了B+樹的結構來存儲索引數據。

當使用索引列進行數據查詢的時候,最終會到主鍵索引樹中查詢對應的數據行進行返回。

理論上來說,使用索引列查詢,就能很好的提升查詢效率,但是不規範的使用會導致索引失效,從而無法發揮索引本身的價值。

導致索引失效的情況有很多:

  1. 在索引列上做運算,比如使用函數,Mysql在生成執行計劃的時候,它是根據統計信息來判斷是否要使用索引的。

    而在索引列上加函數運算,導致Mysql無法識別索引列,也就不會再走索引了。

    不過從Mysql8開始,增加了函數索引可以解決這個問題。

  2. 在一個由多列構成的組合索引中,需要按照最左匹配法則,也就是從索引的最左列開始順序檢索,否則不會走索引。

    在組合索引中,索引的存儲結構是按照索引列的順序來存儲的,因此在sql中也需要按照這個順序才能進行逐一匹配。

    否則InnoDB無法識別索引導致索引失效。

  3. 當索引列存在隱式轉化的時候, 比如索引列是字元串類型,但是在sql查詢中沒有使用引號。

    那麼Mysql會自動進行類型轉化,從而導致索引失效。

  4. 在索引列使用不等於號、not查詢的時候,由於索引數據的檢索效率非常低,因此Mysql引擎會判斷不走索引。

  5. 使用like通配符匹配尾碼%xxx的時候,由於這種方式不符合索引的最左匹配原則,所以也不會走索引。

    但是反過來,如果通配符匹配的是首碼xxx%,符合最左匹配,也會走索引。

  6. 使用or連接查詢的時候,or語句前後沒有同時使用索引,那麼索引會失效。只有or左右查詢欄位都是索引列的時候,才會生效。

除了這些場景以外,對於多表連接查詢的場景中,連接順序也會影響索引的使用。

不過最終是否走索引,我們可以使用explain命令來查看sql的執行計劃,然後針對性的進行調優即可。

總結

Mysql裡面很多問題都可以考察畢竟它也是工作中使用非常頻繁的組件,按道理來說,我們是有必要去深度學習Mysql的底層原理。

畢竟數據的安全性、數據IO性能都會影響到系統的整體吞吐量。

大家記得點贊、收藏加關註。

file

版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關註和贊,您的堅持是我不斷創作的動力。歡迎關註「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • TortoiseGit 人稱小烏龜插件是一個來源的版本控制客戶端,和git功能類似, 不過相對於git支持界面操作. TortoiseGit下載地址: 點我下載 當前穩定版本是2.6.0, 建議下載此版本, 下麵是下載過程(winx64位系統): 預設是英文安裝, 需要中文的情況可以下載中文語言包 ...
  • redis入門 redis的常見五種數據類型 String類型 String類型,類似於java中的String類型,常見使用get,set方法。 ==String類型還可以存儲json字元串格式==。 Hash類型 Hash類型,也叫散列,它的value是一個無序字典,類似於java中HashMa ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
  • 背景 某個周末一個線上項目因為伺服器自動重啟導致了系統掛了,我們是通過jenkins部署的jar包所以需要手動重啟項目,解決問題後準備調換部署方式讓項目隨系統自動啟動,試用tomcat後發現啟動慢,並且日常開發springboot都是使用內置tomcat啟動,如果要保持和部署方式保持一致(避免本地代 ...
  • 1.七個網站的Python實戰代碼 1.汽車之家 def t1(): #汽車之家 ##請上傳JPG、JPEG、BMP格式圖片 import requests from requests_toolbelt import MultipartEncoder from bs4 import Beautifu ...
  • Java中線程的狀態類型 線程的狀態類型 源碼作者的原註釋關於線程內部類State描述了線程的六個狀態 A thread state. A thread can be in one of the following states: ①、NEW 尚未啟動的線程處於此狀態 源碼中的註釋 A thread ...
  • Swagger介面管理文檔 訪問介面文檔的網頁:http://localhost:8080/swagger-ui/index.html 導入依賴 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-start ...
  • 1、基於jQuery的Ajax 1.1 基本Ajax | 參數 | 說明 | | | | | url | 請求地址 | | type | 請求類型 | | data | 請求參數 | | dataType | 返回參數 | | success | 成功處理函數 | | error | 錯誤處理函數 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...