MySQL索引失效的幾種情況

来源:http://www.cnblogs.com/shynshyn/archive/2017/11/24/7887742.html
-Advertisement-
Play Games

1.索引無法存儲null值 a.單列索引無法儲null值,複合索引無法儲全為null的值。 b.查詢時,採用is null條件時,不能利用到索引,只能全表掃描。 為什麼索引列無法存儲Null值? a.索引是有序的。NULL值進入索引時,無法確定其應該放在哪裡。(將索引列值進行建樹,其中必然涉及到諸多 ...


1.索引無法存儲null值

  a.單列索引無法儲null值,複合索引無法儲全為null的值。

  b.查詢時,採用is null條件時,不能利用到索引,只能全表掃描。

   為什麼索引列無法存儲Null值?

  a.索引是有序的。NULL值進入索引時,無法確定其應該放在哪裡。(將索引列值進行建樹,其中必然涉及到諸多的比較操作,null 值是不確定值無法  

  比較,無法確定null出現在索引樹的葉子節點位置。) 

  b.如果需要把空值存入索引,方法有二:其一,把NULL值轉為一個特定的值,在WHERE中檢索時,用該特定值查找。其二,建立一個複合索引。例如 

  create index ind_a on table(col1,1);  通過在複合索引中指定一個非空常量值,而使構成索引的列的組合中,不可能出現全空值。 

  

2.不適合鍵值較少的列(重覆數據較多的列)

  假如索引列TYPE有5個鍵值,如果有1萬條數據,那麼 WHERE TYPE = 1將訪問表中的2000個數據塊。

  再加上訪問索引塊,一共要訪問大於200個的數據塊。

  如果全表掃描,假設10條數據一個數據塊,那麼只需訪問1000個數據塊,既然全表掃描訪問的數據塊

  少一些,肯定就不會利用索引了。

3.前導模糊查詢不能利用索引(like '%XX'或者like '%XX%')

  假如有這樣一列code的值為'AAA','AAB','BAA','BAB' ,如果where code like '%AB'條件,由於前面是

  模糊的,所以不能利用索引的順序,必須一個個去找,看是否滿足條件。這樣會導致全索引掃描或者全表掃

  描。如果是這樣的條件where code like 'A % ',就可以查找CODE中A開頭的CODE的位置,當碰到B開頭的

  數據時,就可以停止查找了,因為後面的數據一定不滿足要求。這樣就可以利用索引了。

4.索引失效的幾種情況

  1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因)

  要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

  2.對於多列索引,不是使用的第一部分,則不會使用索引

  3.like查詢以%開頭

  4.如果列類型是字元串,那一定要在條件中將數據使用引號引用起來,否則不使用索引

  5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引

5.MySQL主要提供2種方式的索引:B-Tree索引,Hash索引

  B樹索引具有範圍查找和首碼查找的能力,對於有N節點的B樹,檢索一條記錄的複雜度為O(LogN)。相當於二分查找。

  哈希索引只能做等於查找,但是無論多大的Hash表,查找複雜度都是O(1)。

  顯然,如果值的差異性大,並且以等值查找(=、 <、>、in)為主,Hash索引是更高效的選擇,它有O(1)的查找複雜度。

  如果值的差異性相對較差,並且以範圍查找為主,B樹是更好的選擇,它支持範圍查找。

 

 

from https://www.cnblogs.com/binyue/p/4058931.html


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

-Advertisement-
Play Games
更多相關文章
  • --web客戶端JavaScript <!-- 調用方式 --> <body onload="checkCookie()"></body> function getYourIP() { const RTCPeerConnection = window.RTCPeerConnection || win ...
  • JSONP技術 JSONP是解決跨域問題的一種常見方式 跨域問題,因為瀏覽器有同源策略,所以當不同域間進行數據交互的時候就會出現跨域問題 同源策略:只有在同協議、同功能變數名稱、同埠的情況下才能進去數據交互 JSONP的原理:可以利用script標簽(會使用回調函數來接收數據)的src屬性不受同源策略的影 ...
  • 繼承是一種節省記憶體,復用代碼,使代碼組織更高效的編程思想。在本篇文章中,我將詳細解釋JavaScript中繼承的實現方式,相信通過閱讀本篇文章,你將徹底掌握JavaScript繼承技術,希望你能在工作中找準時機,發揮這一技術的價值。 ...
  • 在學習廖雪峰前輩的JavaScript教程中,遇到了一些需要註意的點,因此作為學習筆記列出來,提醒自己註意! 如果大家有需要,歡迎訪問前輩的博客https://www.liaoxuefeng.com/學習。 在一個對象中綁定函數,我們稱這個函數是這個對象的方法。 在前面的學習中,對象的定義如下: 如 ...
  • 什麼是動作呢?顧名思義它是管理運行環境中所有動作的中樞,通俗點講就是動畫。它也是總個框架核心組件之一,它提供動作的創建、刪除、插入,以及提供對關鍵幀與過渡的諸多操作 ...
  • Bootstrap FileInput中文API整理 這段時間做項目用到bootstrap fileinput插件上傳文件,在用的過程中,網上能查到的api都不是很全,所以想著整理一份比較詳細的文檔,方便自己今後使用,也希望能給大家帶來幫助,如有錯誤,希望大家積極指正。 一、 引入文件 <link ...
  • 效果實現圖 ...
  • [20171124]bbed的使用問題2.txt--//bbed 是探究oracle數據塊的好工具,有時候不用轉儲,直接可以它看oracle內部塊的內部結構.--//在使用中要註意一些問題,昨天又犯類似錯誤,通過例子來說明:SCOTT@book> select rowid,dept.* from d ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...