【MySQL】MySQL不走索引的情況分析

未建立索引

當數據表沒有設計相關索引時,查詢會掃描全表。

create table test_temp
(test_id     int auto_incrementprimary key,field_1     varchar(20) null,field_2     varchar(20) null,field_3     bigint      null,create_date date        null
);
explain 
select * from test_temp where field_1 = 'testing0';

在這里插入圖片描述

建議

查詢頻繁是數據表字段增加合適的索引。

查詢結果集是原表中的大部分數據

當數據庫查詢命中索引時,數據庫會首先利用索引列的值定位到對應的數據節點。這個數據節點上記錄了對應數據行的行標識符(Row Identifier)。然而,如果查詢需要獲取該行其他列的數據,就需要進行回表操作。

在回表操作中,數據庫會使用行標識符再次訪問數據節點或磁盤上的實際數據行,以獲取完整的數據。這個過程被稱為回表。回表操作可能會增加額外的磁盤訪問和數據檢索的開銷,因此,在某些情況下,當MySQL判斷回表所需的資源大于直接掃描全表時,它可能選擇不走索引,而是執行全表掃描。
在這里插入圖片描述

建議

  1. 索引覆蓋:酌情考慮創建包含查詢所需列的索引,查詢結果集全部被索引覆蓋,無需回表。
  2. 調整查詢語句:查詢必要的列、使用Join語句優化查詢語句,減少回表次數。
  3. 當表數據量較大時,需考慮其他存儲服務。

使用函數、隱式轉換

使用函數

在這里插入圖片描述

在這里插入圖片描述

隱式轉換

數據準備:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for products
-- ----------------------------
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (`id` int NOT NULL,`name` varchar(255) NOT NULL,`price` decimal(10,2) NOT NULL,`description` text,`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`type` tinyint NOT NULL COMMENT '商品類型',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;-- ----------------------------
-- Records of products
-- ----------------------------
BEGIN;
INSERT INTO `products` VALUES (1, 'Product A', 10.99, 'This is the description for Product A', '2023-08-11 03:47:06', '2023-08-11 03:49:24', 1);
INSERT INTO `products` VALUES (2, 'Product B', 19.99, 'This is the description for Product B', '2023-08-11 03:47:07', '2023-08-11 03:49:24', 2);
INSERT INTO `products` VALUES (3, 'Product C', 5.99, 'This is the description for Product C', '2023-08-11 03:47:07', '2023-08-11 03:49:25', 3);
INSERT INTO `products` VALUES (4, 'Product D', 8.49, 'This is the description for Product D', '2023-08-11 03:47:07', '2023-08-11 03:49:24', 2);
INSERT INTO `products` VALUES (5, 'Product E', 15.99, 'This is the description for Product E', '2023-08-11 03:47:07', '2023-08-11 03:49:25', 2);
INSERT INTO `products` VALUES (6, 'Product F', 12.99, 'This is the description for Product F', '2023-08-11 03:47:08', '2023-08-11 03:49:24', 2);
INSERT INTO `products` VALUES (7, 'Product G', 7.99, 'This is the description for Product G', '2023-08-11 03:47:08', '2023-08-11 03:49:24', 2);
INSERT INTO `products` VALUES (8, 'Product H', 9.99, 'This is the description for Product H', '2023-08-11 03:47:08', '2023-08-11 03:49:24', 2);
INSERT INTO `products` VALUES (9, 'Product I', 14.99, 'This is the description for Product I', '2023-08-11 03:47:09', '2023-08-11 03:49:24', 2);
INSERT INTO `products` VALUES (10, 'Product J', 11.99, 'This is the description for Product J', '2023-08-11 03:47:09', '2023-08-11 03:49:24', 2);
COMMIT;SET FOREIGN_KEY_CHECKS = 1;

增加索引

ALTER TABLE products
ADD INDEX idx_type (type);

復現:

explain
select * from products where type in ('1','2');

由于type是tinyint類型,因此,以上SQL等效為:

SELECT * FROM products WHERE type in CAST('1' AS tinyint,'2' as tinyint);

在這里插入圖片描述

由于使用了CAST()函數,會導致不走索引的現象。
還有一種情況是:在關聯查詢時,驅動表關聯字段兩者排序規則不一致時也會導致不走索引。

in/not in <>條件導致不走索引

in、not in、<>不走索引的原因是相似的,以下基于in語句分析。
in條件導致不走索引的情況:

in條件過多

explain
select * from products where type in (1,2,3,4,5,6,7);

如果 IN 條件中包含太多的值,超出了數據庫管理系統的限制,它可能會選擇不使用索引。

建議

當in條件中的數據是連續時,可以使用between and代替in。
分而治之,將一次查詢分為多次查詢,最后取并集。
使用UNION語句,類似方案一,只不過該方案是在SQL層面完成。

SELECT column1, column2, ...
FROM your_table
WHERE column IN (value1, value2, ..., valueN)
UNION
SELECT column1, column2, ...
FROM your_table
WHERE column IN (valueN+1, valueN+2, ..., valueM)

統計信息不準確

SHOW ENGINE INNODB STATUS;

該命令會查詢出MySQL Inndb存儲引擎的操作情況,信息包含Innodb各種統計信息:

  • Inserts:已插入的行數。
  • Updates:已更新的行數。
  • Deletes:已刪除的行數。
  • Reads:已讀取的行數。

innodb表的統計信息并不是實時統計更新,如果統計信息和實際的索引信息差異很大,就會導致優化器計算各個索引成本后,做出非預期的選擇。出現這種現象的場景是:當有大量數據在短時間內落庫時,Innodb還沒更新統計相關信息,此時來了一個查詢,MySQL會基于歷史數據做出錯誤的判斷:當前表數據量少,不走索引更高效。

建議

基于此問題的解決方案是:手動更新相關統計數據。
請參考:
www.modb.pro/db/46678

like語句

like語句無法命中索引的情況:

前導通配符:%value
通配符在字符串的中間:value%value
通配符"_"出現在開頭

建議

盡量避免在模式的開頭使用前導通配符 %
如果無法避免第一種,根據實際業務和查詢語句考慮使用后綴索引
將通配符 % 放在模式的末尾,以便進行前綴匹配。
如果需要在模式的中間使用通配符 %,可以考慮使用全文搜索引擎或其他更適合模式匹配的技術。
對于固定長度的模式匹配,可以考慮使用其他操作符,如 = 或 <>

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

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

相關文章

ffmpeg命令行是如何打開vf_scale濾鏡的

前言 在ffmpeg命令行中&#xff0c;ffmpeg -i test -pix_fmt rgb24 test.rgb&#xff0c;會自動打開ff_vf_scale濾鏡&#xff0c;本章主要追蹤這個流程。 通過gdb可以發現其基本調用棧如下&#xff1a; 可以看到&#xff0c;query_formats&#xff08;&#xff09;中創建的v…

Unity框架學習--2

接上文 IOC 容器是一個很方便的模塊管理工具。 除了可以用來注冊和獲取模塊&#xff0c;IOC 容器一般還會有一個隱藏的功能&#xff0c;即&#xff1a; 注冊接口模塊 抽象-實現 這種形式注冊和獲取對象的方式是符合依賴倒置原則的。 依賴倒置原則&#xff08;Dependence I…

maven install

maven install maven 的 install 命令&#xff0c;當我們的一個 maven 模塊想要依賴其他目錄下的模塊時&#xff0c;直接添加會找不到對應的模塊&#xff0c;只需要找到需要引入的模塊&#xff0c;執行 install 命令&#xff0c;就會將該模塊放入本地倉庫&#xff0c;就可以進…

Linux tar包安裝 Prometheus 和 Grafana(知識點:systemd Unit/重定向)

0. 介紹 用tar包的方式安裝 Prometheus 和 Grafana Prometheus:開源的監控方案Grafana:將Prometheus的數據可視化平臺 Prometheus已經有了查詢功能為什么還需要grafana呢?Prometheus基于promQL這一SQL方言,有一定門檻!Grafana基于瀏覽器的操作與可視化圖表大大降低了理解難…

Vue3 setup tsx 子組件向父組件傳值 emit

需求&#xff1a;Vue3 setup 父組件向子組件傳值&#xff0c;子組件接收父組件傳入的值&#xff1b;子組件向父組件傳值&#xff0c;父組件接收的子組件傳遞的值。 父組件&#xff1a;parent.tsx&#xff1a; import { defineComponent, ref, reactive } from vue; import To…

【Android】okhttp爆java.lang.IllegalStateException: closed的解決方法

解決 java.lang.IllegalStateException: closed異常通常是由于OkHttp中的Response對象在調用response.body().string()后被關閉而導致的。 在代碼中&#xff0c;在onResponse()方法中如果兩次調用了response.body().string()&#xff0c;每次調用都會消耗掉響應體并關閉Respo…

如何優化PHP Smarty模板的性能?

Smarty模板是一種非常強大的模板引擎&#xff0c;但是如果不正確地使用&#xff0c;可能會導致你的網站慢得像一只樹懶&#xff01; 那么&#xff0c;如何優化Smarty模板的性能呢&#xff1f; 減少Smarty對象的創建 你可能會在代碼中多次創建Smarty對象。但是&#xff0c;每次…

Server - 文字轉語音 (Text to Speech) 的在線服務 TTSMaker

歡迎關注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132287193 TTSMaker 是一款免費的文本轉語音工具&#xff0c;提供語音合成服務&#xff0c;支持多種語言&#xff0c;包括英語、法語、德語、西班…

什么是冒煙測試?

冒煙測試&#xff0c;剛進公司就接觸到了。只是剛開始一直沒有體會到冒煙的含義和精髓&#xff0c;一直以為是冒煙測試就是把待測產品的主要功能測試一下就行了。后面回想一下&#xff0c;不是那么回事的。 冒煙測試源自硬件行業&#xff0c;對一個硬件或者硬件組件改動后&…

Exams/ece241 2013 q4

蓄水池問題 S3 S2 S1 例如&#xff1a;000 代表 無水 &#xff0c;需要使FR3, FR2, FR1 都打開&#xff08;111&#xff09; S3 S2 S1 FR3 FR2 FR1 000 111 001 011 011 001 111 000 fr代表水變深為…

快手商品詳情數據API 抓取快手商品價格、銷量、庫存、sku信息

快手商品詳情數據API是用來獲取快手商品詳情頁數據的接口&#xff0c;請求參數為商品ID&#xff0c;這是每個商品唯一性的標識。返回參數有商品標題、商品標題、商品簡介、價格、掌柜昵稱、庫存、寶貝鏈接、寶貝圖片、商品SKU等。 接口名稱&#xff1a;item_get 公共參數 名…

【PostgreSQL的CLOG解析】

同樣還是這張圖&#xff0c;之前發過shared_buffer和os cache、wal buffer和work mem的文章&#xff0c;今天的主題是圖中的clog&#xff0c;即 commit log&#xff0c;PostgreSQL10之前放在數據庫目錄的pg_clog下面。PostgreSQL10之后修更名為xact,數據目錄變更為pg_xact下面&…

WPF 本地化的最佳做法

WPF 本地化的最佳做法 資源文件英文資源文件 en-US.xaml中文資源文件 zh-CN.xaml 資源使用App.xaml主界面布局cs代碼 App.config輔助類語言切換操作類資源 binding 解析類 實現效果 應用程序本地化有很多種方式&#xff0c;選擇合適的才是最好的。這里只討論一種方式&#xff0…

pytorch單機多卡后臺運行

nohup sh ./train_chat.sh > train_chat20230814.log 2>1&參考資料 Pytorch單機多卡后臺運行的解決辦法

kafka-2.12使用記錄

kafka-2.12使用記錄 安裝kafka 2.12版本 下載安裝包 根據你的系統下載rpm /deb /zip包等等, 這里我使用的是rpm包 安裝命令 rpm -ivh kafka-2.12-1.nfs.x86_64.rpm啟動內置Zookeeper 以下命令要寫在同一行上 /opt/kafka-2.12/bin/zookeeper-server-start.sh /opt/kafka-2…

實驗二十八、三角波發生電路參數的確認

一、題目 利用 Multisim 確定圖1所示電路中各元件的參數&#xff0c;使輸出電壓的頻率為 500 Hz 500\,\textrm{Hz} 500Hz、幅值為 6 V 6\,\textrm{V} 6V 的三角波。 圖 1 三角波發生電路 圖1\,\,三角波發生電路 圖1三角波發生電路 2、仿真電路 A 1 \textrm A_1 A1? 采用…

深入解析 MyBatis 中的 lt;foreachgt; 標簽:優雅處理批量操作與動態 SQL

在當今的Java應用程序開發中&#xff0c;數據庫操作是一個不可或缺的部分。MyBatis作為一款頗受歡迎的持久層框架&#xff0c;為我們提供了一種優雅而高效的方式來管理數據庫操作。在MyBatis的眾多特性中&#xff0c;<foreach>標簽無疑是一個強大的工具&#xff0c;它使得…

sift-1M數據集的讀取及ES插入數據

sift是檢查ann近鄰召回率的標準數據集,ann可以選擇faiss,milvus等庫或者方法;sift數據分為query和base,以及label(groundtruth)數據。本文采用sift-1M進行解讀,且看如下: 1、sift-1m數據集 官方鏈接地址:Evaluation of Approximate nearest neighbors: large datase…

Java:簡單算法:冒泡排序、選擇排序、二分查找

冒泡排序 // 1、準備一個數組 int[] arr {5&#xff0c;2&#xff0c;3&#xff0c;1};//2、定義一個循環控制排幾輪 for (int i 0; i < arr.length - 1; i) { // i 0 1 2 【5&#xff0c;2&#xff0c;3&#xff0c;1】 次數 // i 0 第一輪 0 1 2 …

P4377 [USACO18OPEN] Talent Show G

P4377 [USACO18OPEN] Talent Show G [P4377 USACO18OPEN] Talent Show G - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 文章目錄 P4377 [USACO18OPEN] Talent Show G題目題目描述輸入格式輸出格式樣例 #1樣例輸入 #1樣例輸出 #1 提示樣例解釋數據規模與約定 思路code 題目 …