數據庫索引失效的11種情況

MySQL中 提高性能 的一個最有效的方式是對數據表 設計合理的索引。索引提供了高效訪問數據的方法,并且加快查詢的速度,因此索引對查詢的速度有著至關重要的影響。使用索引可以 快速地定位 表中的某條記錄,從而提高數據庫査詢的速度,提高數據庫的性能。.如果查詢時沒有使用索引,查詢語句就會掃描表中的所有記錄。在數據量大的情況下,這樣查詢的速度會很慢。
大多數情況下都(默認)采用 B+樹 來構建索引。只是空間列類型的索引使用 R-樹 ,并且MEMORY表還支持 hash索引。其實,用不用索引,最終都是優化器說了算。優化器是基于什么的優化器?基于cost開銷(CostBase0ptimizer),它不是基于規則(Rule-Basedoptimizer),也不是基于 語義。怎么樣開銷小就怎么來。另外,SQL語句是否使用索引,跟數據庫版本、數據量、數據選擇度都有關系。
以下是數據庫中索引失效常見的11種情況:
1、全職匹配我最愛:
假如有三個索引:索引1是對字段name添加的索引,索引2是對字段(name,class_id)添加了聯合索引,索引3是對字段(name,class_id,age)添加的聯合索引;
在進行查詢中條件判斷包含字段(name,class_id,age)時,會優先使用索引3,相當于索引1、索引2失效。
2、最佳左前綴法則:
在MySQL建立聯合索引時會遵守最佳左前綴原則,即最左優先,在檢索數據時從聯合索引的最左邊開始匹配。
例如索引(name,class_id,age),只有查詢(name),(name,class_id),(name,class_id,age)會走索引,而(class_id),(class_id,age),(age)都不會走索引。
MySQL可以為多個字段創建索引,一個索引可以包括16個字段。對于多列索引,過濾條件要使用索引必須按照索引建立時的順序,從左到右,依次滿足,一旦跳過某個字段,索引后面的字段都無法被使用。如果查詢條件中沒有使用這些字段中第1個字段時,多列(或聯合)索引不會被使用。
3、主鍵插入順序
對于一個使用 InnoDB 存儲引擎的表來說,在我們沒有顯式的創建索引時,表中的數據實際上都是存儲在 聚簇索引的葉子節點的。而記錄又是存儲在數據頁中的,數據頁和記錄又是按照記錄 主鍵值從小到大 的順序進行排序,所以如果我們 插入 的記錄的主鍵值是依次增大的話,那我們每插滿一個數據頁就換到下一個數據頁繼續插,而如果我們插入的,主鍵值忽大忽小的話,則可能會造成頁面分裂和記錄移位。
頁面分裂和記錄移位意味著: 性能損耗 !所以如果我們想盡量避免這樣無謂的性能損耗,最好讓插入的記錄的 主鍵值依次遞增 ,這樣就不會發生這樣的性能損耗了。 所以我們建議:讓主鍵具有 AUTO_INCREMENT ,讓存儲引擎自己為表生成主鍵,而不是我們手動插入 。這樣的主鍵占用空間小,順序寫入,減少頁分裂。
4、計算、函數、類型轉換(自動或手動)導致索引失效
在使用計算、函數、類型轉換時,要遍歷全表進行計算、函數、類型轉換得到一個新的結果和條件值進行比較,所以沒有使用索引。
如果給字段name創建了索引,則

#1.索引優化失效
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE LEFT(student.name,3) = 'abc';
#索引優化生效
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE student.name LIKE 'abc%';

5、類型轉換導致索引失效
如果name是varchar類型,并創建了索引

# 數字默認轉成字符串導致索引失敗
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE name=123;
# 索引優化成目標字符串,走索引
EXPLAIN SELECT SQL_NO_CACHE * FROM student WHERE name='123';

6、范圍條件右邊的列索引失效
例如(name,class_id,age)聯合索引,查詢條件name,class_id,age,如果class_id使用了范圍查詢,那么class_id右邊的age索引失效。這里右邊看的聯合索引的鍵右邊。
解決辦法:新建聯合索引(name,age,class_id)或(age,name,class_id),把需要范圍查詢的字段放在最后。
范圍包括:<、<=、>、>=和 between等。
應用開發中范圍查詢,例如:金額查詢,日期查詢往往都是范圍查詢。應將查詢條件放置where語句最后。創建的聯合索引中,務必把范圍涉及到的字段寫在最后)
7、不等于(!= 或者<>)索引失效
要進行全表掃描
8、is null可以使用索引,is not null無法使用索引
最好在設計數據表的時候就將 字段設置為 NOT NULL 約束 ,比如你可以將INT 類型的字段,默認值設置為 0。將字符類型的默認值設置為空字符串(“”)。
同理,在查詢中使用 not like 也無法使用索引,導致全表掃描。
9、like以通配符%開頭索引失效
在使用LIKE關鍵字進行査詢的査詢語句中,如果匹配字符串的第一個字符為“%”,索引就不會起作用。只有“%”不在第一個位置,索引才會起作用。
【強制】頁面搜索嚴禁左模糊或者全模糊,如果需要請走搜索引擎來解決。
10、OR 前后存在非索引的列,索引失效
在 WHERE 子句中,如果在 OR 前的條件列進行了索引,而在 OR后的條件列沒有進行索引,那么索引會失效。也就是說,OR前后的兩個條件中的列都是索引時,查詢中才使用索引。
因為 OR的含義就是兩個只要滿足一個即可,因此,只有一個條件列進行了索引是沒有意義的,只要有條件列沒有進行索引,就會進行 全表掃描,因此索引的條件列也會失效。
11、數據庫和表的字符集統一使用utf8mb4
統一使用utf8mb4(5.5.3版本以上支持)兼容性更好,統一字符集可以避免由于字符集轉換產生的亂碼。不同的字符集 進行比較前需要進行轉換會造成索引失效。
以下我附上宋紅康老師的視頻教程鏈接供大家詳細學習
數據庫索引失效的11種情況上
數據庫索引失效的11種情況下

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

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

相關文章

js獲取選中區域(window.getSelection的基本使用)

返回一個 Selection 對象&#xff0c;表示用戶選擇的文本范圍或光標的當前位置。 const selection window.getSelection() 1.toString() //光標選中的文本 const selectedText selection.toString() 2.getRangeAt() //返回一個包含當前選區內容的區域對象。 selection…

數據與文字的表示方法

目錄 1. 數據格式 1. 文本文件格式 2. 二進制文件格式 3. 數據庫格式 4. 壓縮格式 2. 數字機器碼表示 整數表示 浮點數表示 3. 字符與數組的表示方法 1. ASCII&#xff08;美國信息交換標準代碼&#xff09; 2. 擴展ASCII 3. Unicode 4. UTF-8&#xff08;8 位 Uni…

面試相關-接口測試常問的問題

1.為什么要做接口測試 (1)現在大多系統都是前后端分離的項目,前端和后端的進度可能不一樣,那為了盡早的進入測試,前端界面沒有開發完成的情況下,只要后端的接口開發完了,就可以提前做接口測試了; (2)基于安全考慮,只依賴前端進行限制,已經完全不滿足系統的安全性…

Power Pivot——常用DAX 函數

常用DAX 函數 以下這些函數是 DAX 中最常用的一部分&#xff0c;通過熟練掌握這些函數&#xff0c;你可以有效地進行數據分析和建模。 聚合函數 (Aggregation Functions) SUM() 用途&#xff1a;對指定列中的所有數值求和。 語法&#xff1a;SUM() 示例&#xff1a;SUM(Sale…

重生之我要學后端01--后端語言選擇和對應框架選擇

編程語言 后端開發通常需要掌握至少一種編程語言。以下幾種語言在后端開發中非常流行&#xff1a; Java&#xff1a;廣泛用于企業級應用程序。Python&#xff1a;因其易學性和強大的庫支持&#xff08;如Django和Flask&#xff09;而受歡迎。Node.js&#xff08;JavaScript&a…

電商賣家怎么快速采集復制1688全店寶貝到自己店鋪?淘/貓/拼/抖都適用!

1688上面的貨源品類豐富&#xff0c;很多賣家都是在這里找廠家&#xff0c;當我們找好廠家后&#xff0c;怎么將廠家店鋪里所有寶貝都復制到自己店鋪呢&#xff1f; 雖然1688平臺本身支持鋪貨到其他平臺&#xff0c;但一個個鋪貨太耗費時間了。 阿里巴巴中國站獲得1688商品詳…

【AI大模型RAG】深入探索檢索增強生成(RAG)技術

目錄 1. 引言2. RAG技術概述2.1 RAG技術的定義2.2 RAG技術的工作原理2.3 RAG技術的優勢2.4 RAG技術的應用場景 3. RAG的工作流程3.1 輸入處理3.2 索引建立3.3 信息檢索3.4 文檔生成3.5 融合與優化 4. RAG范式的演變4.1 初級 RAG 模型4.2 高級 RAG 模型4.3 模塊化 RAG 模型優化技…

會計報表分析

目錄 一. 會計報表的種類 \quad 一. 會計報表的種類 \quad 反應財務狀況的是資產負債表 反應經營成果的是利潤表 有時間點的就是靜態表 動態表就是有一個區間的, 比如一年, 一個季度等

探索這些有趣的API,讓你的應用與眾不同

在這個由數據驅動的時代&#xff0c;我們每天都在與各種應用程序和服務互動&#xff0c;卻很少意識到它們背后的技術奇跡。API&#xff0c;作為這些互動的幕后英雄&#xff0c;不僅簡化了開發過程&#xff0c;還擴展了技術的邊界。有趣的API&#xff0c;特別是那些能夠激發創新…

QT 如何儲存多種數據類型(QVariant )

QVariant 是 Qt 框架中用于存儲各種數據類型的類。它提供了一個強大的類型系統&#xff0c;允許你在運行時存儲和檢索多種類型的數據&#xff0c;而不需要在編譯時確定類型。QVariant 的主要優點在于它的靈活性和通用性&#xff0c;這使得它在 Qt 的很多組件和機制中都被廣泛使…

時間戳是什么,如何使用時間戳

時間戳&#xff08;Timestamp&#xff09;是表示特定時間點的數值&#xff0c;通常以自1970年1月1日00:00:00 UTC&#xff08;協調世界時&#xff09;以來的秒數或毫秒數來表示。這個時間點被稱為Unix紀元&#xff08;Unix epoch&#xff09;。時間戳廣泛用于計算機系統中&…

數據結構教材關于C/C++的研究

變量 指針 引用 變量 普通變量表示一個內存空間&#xff0c;直接printf是內存空間里的值 結構體 定義一個結構體類型變量為什么必須用指針&#xff1f; 因此無法確定結構體需要多少空間&#xff0c;改用指針可以解決這個問題&#xff0c;因為指針的大小是固定的 指針 指…

HTTP協議和Nginx

一、HTTP協議和Nginx 1.套接字Socket 套接字Socket是進程間通信IPC的一種實現&#xff0c;允許位于不同主機&#xff08;或同一主機&#xff09;上不同進程之間進行通信和數據交換&#xff0c;SocketAPI出現于1983年BSD4.2實現在建立通信連接的每一端&#xff0c;進程間的傳輸…

binlog與redolog的區別

binlog與redolog的區別 在數據庫管理系統中&#xff0c;日志系統扮演著至關重要的角色&#xff0c;它記錄了數據庫的所有更改&#xff0c;從而確保在發生故障時能夠恢復數據。其中&#xff0c;binlog&#xff08;二進制日志&#xff09;和redolog&#xff08;重做日志&#xf…

Eureka是什么?它是如何工作的?

Eureka是Netflix開發的服務發現框架&#xff0c;現在是Spring Cloud生態系統的一部分。它主要用于AWS云平臺&#xff0c;用來定位服務&#xff0c;以實現中間層服務器的負載均衡和故障轉移。在微服務架構中&#xff0c;服務發現是關鍵的一環&#xff0c;它允許服務和服務彼此發…

理解MySQL核心技術:外鍵的概念、作用和應用實例

引言 在數據庫管理系統&#xff08;DBMS&#xff09;中&#xff0c;外鍵&#xff08;Foreign Key&#xff09;是維持數據一致性和實現數據完整性的重要工具。本文將詳細介紹MySQL外鍵的基本概念、作用&#xff0c;以及相關的操作指南和應用實例&#xff0c;幫助讀者掌握并靈活…

深入了解PHP的If...Else語句

PHP是目前最流行的服務器端編程語言之一&#xff0c;用于開發動態和交互式網站。在PHP編程中&#xff0c;控制結構是非常重要的概念&#xff0c;它們決定了代碼的執行流程。其中&#xff0c;if…else語句是最常用的控制結構之一。本文將深入介紹PHP中的if…else語句&#xff0c…

【Android】怎么創建一個隱藏圖標的應用

項目需求 創建一個不帶啟動圖標的app 項目實現 1.低版本上 在低版本的Android系統上面&#xff0c;可以簡單使用這個,但是現在很多版本都不適用了。 <activityandroid:name".MainActivity"><intent-filter><action android:name"android.int…

算子級血緣和血緣查詢管理

數據鏈路 血緣關系 應用場景&#xff1a;數據資產&#xff0c;數據開發&#xff0c;數據治理&#xff0c;數據安全等等 &#xff08;綠色箭頭上面是數據治理&#xff09; 場景&#xff1a; 數據鏈路的高效盤點與理解 數倉模型的長效優化機制 風險影響的及時全面分析 重復…

linux kswapd0進程cpu占用一直居高不下

kswapd0 是 Linux 內核中的一個進程&#xff0c;負責管理虛擬內存和交換&#xff08;swap&#xff09;操作。當該進程的 CPU 占用率居高不下時&#xff0c;通常表示系統正在頻繁地進行交換操作&#xff0c;可能由于內存不足或內存使用不合理。 可能原因 內存不足&#xff1a; …