mysql有索引但是查詢沒有使用索引是什么問題

關鍵原因分析

  1. 索引選擇性問題

    • 如果 order_id 沒有索引,即使 insert_time 有索引,優化器可能認為先通過 order_id 過濾數據更高效。但由于 order_id 無索引,只能全表掃描后過濾。
    • 即使 insert_time 有索引,如果滿足 insert_time >= '2024-02-26' 的數據量很大(如超過表總行數的 20%),優化器會認為全表掃描比回表更高效
  2. 缺乏復合索引
    單列索引 insert_time 僅能加速時間范圍過濾,但無法同時優化 order_id 的等值查詢。若 order_id 的過濾性(選擇性)高,優化器更傾向于使用復合索引 (order_id, insert_time)

  3. 統計信息不準確
    表的統計信息(如索引基數)過期,導致優化器誤判索引效果。可通過 ANALYZE TABLE tb_oc_order; 更新統計信息。

  4. 隱式類型轉換或函數調用
    如果 transaction_id 的字符集或排序規則與查詢值不匹配,可能導致隱式轉換,從而無法使用索引(需檢查表結構)。


解決方案

  1. transaction_id 添加索引
    如果 transaction_id 選擇性高(如唯一或接近唯一),優先為其單獨創建索引:

    ALTER TABLE tb_oc_order ADD INDEX idx_transaction_id (transaction_id);
    
  2. 創建復合索引
    聯合索引 (transaction_id, insert_time) 可以同時優化兩個條件:

    ALTER TABLE tb_oc_order ADD INDEX idx_trans_insert (transaction_id, insert_time);
    
    • 優勢:先通過 transaction_id 快速定位少量行,再按 insert_time 過濾,效率更高。
  3. 強制使用索引(謹慎使用)
    通過 FORCE INDEX 提示強制使用 insert_time 索引(需確保其確實更優):

    EXPLAIN SELECT * FROM tb_oc_order FORCE INDEX (insert_time_index_name)
    WHERE transaction_id = '202502260333525000251000008' AND insert_time >= '2024-02-26 09:23:15';
    
  4. 檢查數據分布
    執行以下查詢,確認滿足條件的數據比例:

    -- 滿足 insert_time 條件的數據占比
    SELECT COUNT(*) / (SELECT COUNT(*) FROM tb_oc_order) AS ratio
    FROM tb_oc_order
    WHERE insert_time >= '2024-02-26 09:23:15';-- 滿足 transaction_id 條件的數據行數
    SELECT COUNT(*) FROM tb_oc_order WHERE transaction_id = '202502260333525000251000008';
    
    • 如果 transaction_id 匹配行數極少(如 1 行),但 insert_time 范圍覆蓋大部分表,優化器可能優先全表掃描。

優化后的執行計劃

創建復合索引后,執行計劃應類似以下結果(使用索引范圍掃描):

+----+-------------+-------------+------+---------------------+---------------------+---------+-------+------+-----------------------+
| id | select_type | table       | type | key                 | key_len             | ref     | rows  | Extra                 |
+----+-------------+-------------+------+---------------------+---------------------+---------+-------+------+-----------------------+
| 1  | SIMPLE      | tb_oc_order | ref  | idx_trans_insert    | 772 (transaction_id)| const   | 1     | Using index condition |
+----+-------------+-------------+------+---------------------+---------------------+---------+-------+------+-----------------------+

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

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

相關文章

【Qt】為程序增加閃退crash報告日志

背景 隨著軟件代碼量的增加,軟件崩潰閃退的肯能行越來越大,其中一些是難以復現的,比如訪問了訪問了非法地址、被操作系統殺死等。 為此,在軟件出現閃退情況時,盡可能多的記錄閃退發生時信息,對排查閃退原…

C#從入門到精通(35)—如何防止winform程序因為誤操作被關閉

前言: 大家好,我是上位機馬工,碩士畢業4年年入40萬,目前在一家自動化公司擔任軟件經理,從事C#上位機軟件開發8年以上!我們在開發的上位機軟件運行起來以后,一般在右上角都有一個關閉按鈕,正常情況下點擊關閉按鈕就能關閉軟件,但是不排除我們不想關閉軟件,但是因為不…

ffmpeg avdevice_register_all 注冊設備的作用

在 FFmpeg 中,avdevice_register_all() 是一個用于注冊所有輸入和輸出設備的函數。它是 FFmpeg 的 libavdevice 模塊的一部分,專門用于處理音頻和視頻的輸入/輸出設備(如攝像頭、麥克風、屏幕捕獲等)。 以下是對 avdevice_regist…

[RH342]tcpdump

[RH342]tcpdump 1. 題目2. 解題 1. 題目 服務器serverc 和 servera 之間有進程定期發送一個明文密碼,找出它2. 解題 找出通信端口 抓包分析 tcpdump -X -vv port 6644紅框中就是密碼,所以密碼是root123

連接Sql Server時報錯無法通過使用安全套接字層加密與 SQL Server 建立安全連接

文章目錄 一. 前言二. 解決方案 方案1方案2 三. 總結 一. 前言 在《數據庫原理》這門課的實驗上,需要使用SQL Server,然后使用jdbc連接sql server突然報錯為:SQLServerException: “Encrypt”屬性設置為“true”且 “trustServerCertific…

從 Spring Boot 2 升級到 Spring Boot 3 的終極指南

一、升級前的核心準備 1. JDK 版本升級 Spring Boot 3 強制要求 Java 17 及以上版本。若當前項目使用 Java 8 或 11,需按以下步驟操作: 安裝 JDK 17:從 Oracle 或 OpenJDK 官網下載,配置環境變量(如 JAVA_HOME&…

Buildroot 添加自定義模塊-內置文件到文件系統

目錄 概述實現步驟1. 創建包目錄和文件結構2. 配置 Config.in3. 定義 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置與編譯 概述 Buildroot 是一個高度可定制和模塊化的嵌入式 Linux 構建系統,適用于從簡單到復雜的各種嵌入式項目. buildroot的源碼中bui…

物聯網通信應用案例之《智慧農業》

案例概述 在智慧農業方面,一般的應用場景為可以自動檢測溫度濕度等一系列環境情況并且可以自動做出相應的處理措施如簡單的澆水和溫度控制等,且數據情況可遠程查看,以及用戶可以實現遠程控制。 基本實現原理 傳感器通過串口將數據傳遞到Wi…

設計模式| 觀察者模式 Observer Pattern詳解

目錄 一、概述1.1 動機1.2 核心思想1.3 別名 二、角色與實現原理2.1 角色2.2 實現原理2.3 類圖 三、經典接口實現3.1 示例3.1.1 觀察者接口3.1.2 目標接口3.1.3 具體被觀察者3.1.4 具體觀察者3.1.5 Client3.1.6 UML時序圖 3.2 特點 四、其他實現方式4.1 委托與事件(…

kotlin 知識點一 變量和函數

在Kotlin中定義變量的方式和Java 區別很大,在Java 中如果想要定義一個變 量,需要在變量前面聲明這個變量的類型,比如說int a表示a是一個整型變量,String b表 示b是一個字符串變量。而Kotlin中定義一個變量,只允許在變量…

基于數據可視化學習的卡路里消耗預測分析

數據分析實操集合: 1、關于房間傳感器監測數據集的探索 2、EEMD-LSTM模型擇時策略 — 1.EEMD分解與LSTM模型搭建 3、EEMD-LSTM模型擇時策略 — 2. 量化回測 4、國際超市電商銷售數據分析 5、基于問卷調查數據的多元統計數據分析與預測(因子分析、對應分…

記錄Liunx安裝Jenkins時的Package ‘jenkins‘ has no installation candidate

1、確保是否安裝了Java,如果沒有,可通過以下命令進行安裝: sudo apt update sudo apt install openjdk-21-jre2、安裝Jenkins sudo apt update sudo apt install jenkins執行sudo apt install jenkins時,可能會出現 意思是&…

kiln微調大模型-使用deepseek R1去訓練一個你的具備推理能力的chatGPT 4o

前言 隨著deepseek的爆火,對于LLM的各種內容也逐漸步入我的視野,我個人認為,可能未來很長一段時間,AI將持續爆火,進入一段時間的井噴期,AI也會慢慢的走入我們每個家庭之中,為我們的生活提供便利…

用AI玩游戲1——狼人殺六人局

狼人殺六人局1 狼人殺六人局1,好人陣營有兩個平民,一個預言家,一個守衛,壞人陣營有兩個狼人。狼人每晚可以選擇殺死一個人但第一天晚上不能殺人,狼人晚上可以睜眼識別到同伴和其他好人玩家但不知道他們的身份。預言家…

sqli-labs

Less-8 單引號報錯,雙引號顯示正常 又是You are in......看來還是用盲注 布爾盲注: 如下語句是用來判斷當前數據庫名的第一個字母是不是s,后面的以此類推,比較復雜和麻煩 ?id1 and substr(database(),1,1)s -- 比如這個我們通…

自定義ToolbarView實戰指南(Kotlin版)

一、為什么我們需要造輪子? 看到標題你可能會問:系統自帶Toolbar不香嗎?確實香,但遇到這些場景就抓瞎了: 設計稿要求標題欄帶漸變背景動態波浪線產品經理非要搞個不對稱的返回按鈕布局UI設計師堅持標題和副標題要45度…

微軟推出Office免費版,限制諸多,只能編輯不能保存到本地

易采游戲網2月25日獨家消息:微軟宣布推出一款免費的Office版本,允許用戶進行基礎文檔編輯操作,但限制頗多,其中最引人關注的是用戶無法將文件保存到本地。這一舉措引發了廣泛討論,業界人士對其背后的商業策略和用戶體驗…

PyTorch-基礎(CUDA、Dataset、transforms、卷積神經網絡、VGG16)

PyTorch-基礎 環境準備 CUDA Toolkit安裝(核顯跳過此步驟) CUDA Toolkit是NVIDIA的開發工具,里面提供了各種工具、如編譯器、調試器和庫 首先通過NVIDIA控制面板查看本機顯卡驅動對應的CUDA版本,如何去下載對應版本的Toolkit工…

Vue2+Element實現Excel文件上傳下載預覽【超詳細圖解】

目錄 一、需求背景 二、落地實現 1.文件上傳 圖片示例 HTML代碼 業務代碼 2.文件下載 圖片示例 方式一:代碼 方式二:代碼 3.文件預覽 圖片示例 方式一:代碼 方式二:代碼 一、需求背景 在一個愉快的年后&#xff…

【Bug】natten:安裝報錯(臨近注意力機制的高效cuda內核實現)

正常安裝natten報錯 pip install natten 報錯 可以嘗試使用以下網站進行安裝 https://shi-labs.com/natten/ 可以根據自己的cuda與pytorch版本進行安裝 之間復制命令即可,不需要進行任何修改