mysql有索引但是查询没有使用索引是什么问题

embedded/2025/2/27 9:07:00/

关键原因分析

  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.ppmy.cn/embedded/167498.html

相关文章

530 Login fail. A secure connection is requiered(such as ssl)-java发送QQ邮箱(简单配置)

由于cs的csdN许多文章关于这方面的都是vip文章,而本文是免费的,希望广大网友觉得有帮助的可以多点赞和关注! QQ邮箱授权码到这里去开启 授权码是16位的字母,填入下面的mail.setting里面的pass里面 # 邮件服务器的SMTP地址 host…

MSSQL2022的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序

MSSQL2022导入Excel的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序 一、导入情况二、问题发现三、问题解决 最近在安装新版SQLServer SSMS 2022后,每次导入Excel都会出现错误提示:未在本地计算机上注册“Microsoft.…

DeepSeek开源周 Day02:从DeepEP开源趋势重新审视大模型Infra

DeepEP 今天DeepSeek开源周第二天,开放了DeepEP仓库,属实看了下源码,和昨天FlashMLA一样,C权重(包括CUDA)还是占据了绝对部分,作为调包侠的我,看到之后望而却步,想看原理…

Spring MVC框架六:Ajax技术

精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 jQuery.ajax Ajax原理 结语 创作不易,希望能对大家给予帮助 想要获取更多资源? 点击链接获取

京东商品详情API性能优化:缓存分层与热点数据预加载策略

在京东商品详情 API 的使用过程中,性能优化至关重要。缓存分层与热点数据预加载策略是两种有效的优化手段,下面详细介绍: 缓存分层策略 1. 分层结构设计 浏览器缓存 原理:这是最接近用户的一层缓存。当用户首次访问商品详情页时&a…

DeepSeek:面向效率与垂直领域的下一代大语言模型技术解析

本文将深入剖析DeepSeek模型的核心算法架构,揭示其在神经网络技术上的突破性创新,并与主流大模型进行全方位技术对比。文章涵盖模型设计理念、训练范式优化、应用场景差异等关键维度,为读者呈现大语言模型领域的最新发展图景。 一、DeepSeek…

智能优化算法:雪橇犬优化算法(Sled Dog Optimizer,SDO)求解23个经典函数测试集,MATLAB

一、雪橇犬优化算法 算法简介:雪橇犬优化算法(Sled Dog Optimizer,SDO)是2024年10月发表于JCR1区、中科院1区SCI期刊《Advanced Engineering Informatics》的新型仿生元启发式算法。它模拟雪橇犬的拉雪橇、训练和退役行为构建模型…

python-leetcode-乘积最大子数组

152. 乘积最大子数组 - 力扣&#xff08;LeetCode&#xff09; class Solution:def maxProduct(self, nums: List[int]) -> int:if not nums:return 0max_prod nums[0]min_prod nums[0]result nums[0]for i in range(1, len(nums)):if nums[i] < 0:max_prod, min_prod…