MySQL索引失效:为何shop_id索引在特定条件下失效?

mysql索引失效:为何shop_id索引在特定条件下失效?

MySQL索引失效案例分析

本文记录并分析一个MySQL索引失效的案例。

表结构

以下为ns_delivery_shop表的结构定义:

CREATE TABLE `ns_delivery_shop` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,  `goods_id` int(10) NOT NULL COMMENT '商品id',  `sku_id` int(10) NOT NULL COMMENT '商品sku',  `shop_id` int(10) NOT NULL COMMENT '代理商id',  `stock` int(10) NOT NULL COMMENT '库存',  `sales` int(10) NOT NULL COMMENT '销量',  `create_time` int(10) NOT NULL COMMENT '时间',  PRIMARY KEY (`id`),  KEY `idx_shop_id` (`shop_id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='代理商打货表';

测试数据

表中插入以下测试数据:

INSERT INTO `ns_delivery_shop`(`id`, `goods_id`, `sku_id`, `shop_id`, `stock`, `sales`, `create_time`) VALUES(1, 86, 99, 1, 10, 5, 1613960196),(2, 86, 100, 1, 15, 10, 1613960196),(3, 86, 101, 1, 25, 10, 1613960196),(4, 101, 119, 9, 30, 5, 1613960196),(5, 101, 119, 11, 30, 5, 1613960196),(6, 101, 119, 12, 30, 5, 1613960196);

索引失效SQL

观察到以下SQL语句在特定条件下索引失效:当shop_id = 1的记录数量小于等于2时,索引生效;大于2时,索引失效。

EXPLAIN SELECT stock FROM `ns_delivery_shop` WHERE shop_id = 1;

失效原因分析

MySQL优化器在判断是否使用索引时,会根据数据量和查询条件进行成本评估。当满足shop_id = 1条件的记录数量占总数据量的比例超过一定阈值时,MySQL认为全表扫描的效率更高,从而导致索引失效。 这并非索引本身的问题,而是优化器选择的策略。 在数据量较小的情况下,索引的查找开销可能大于全表扫描的开销。

以上就是MySQL索引失效:为何shop_id索引在特定条件下失效?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1284392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月11日 00:37:09
下一篇 2025年12月11日 00:37:18

相关推荐

  • PHP PDO本地预处理语句报错:如何解决SQL_MODE冲突?

    PHP PDO禁用模拟预处理导致的SQL_MODE冲突及解决方案 在PHP PDO中,将pdo::attr_emulate_prepares设置为false以启用本地预处理语句时,可能会遇到与MySQL的sql_mode设置冲突导致的错误。这种错误只在使用预处理语句时出现,直接执行拼接好的SQL语句…

    2025年12月11日
    000
  • PDO本地prepare语句报错ONLY_FULL_GROUP_BY:如何解决?

    PDO本地prepare语句与SQL模式冲突 启用PDO本地prepare功能(pdo::attr_emulate_prepares = false)后,在MySQL 8的ONLY_FULL_GROUP_BY模式下执行包含GROUP BY的语句时,可能会出现错误。 这是因为ONLY_FULL_GRO…

    2025年12月11日
    000
  • Elasticsearch 7中LIKE查询是如何在非索引字段上高效工作的?

    Elasticsearch 7 的 LIKE 查询机制详解 在 Elasticsearch SQL 中,即使目标字段未建立索引,LIKE 查询也能高效地作用于嵌套字段。这得益于 Elasticsearch 的独特机制。 Elasticsearch 7 利用“字段级查询”(Field-Level Qu…

    2025年12月11日
    000
  • 阿里云服务器SSH连接失败但终端正常运行是什么原因?

    阿里云服务器SSH连接异常:终端正常,SSH及80端口却无法访问 本文分析一个常见的阿里云服务器问题:服务器IP可ping通,但SSH连接失败,80端口网站也无法访问,然而已登录的终端却能正常运行。 服务器资源(CPU、内存、带宽)及系统指标(线程数、文件打开数)均正常,连接数量调整也无效。 有趣的…

    2025年12月11日
    000
  • Elasticsearch 7模糊查询为何比MySQL更强大?

    Elasticsearch 7模糊查询:为何胜过MySQL? Elasticsearch 7 的模糊查询功能远超MySQL,即使针对嵌套结构使用类似like的语句也能精准匹配。但这并非源于内存存储或IO操作的差异,而是Elasticsearch强大的索引机制。 不同于MySQL,Elasticsea…

    2025年12月11日
    000
  • PDO本地prepare语句报错:如何解决sql_mode冲突?

    使用PDO的本地prepare语句时,如何避免sql_mode冲突? 当您将PDO的PDO::ATTR_EMULATE_PREPARES属性设置为false时,可能会遇到与sql_mode相关的错误。此错误仅在使用本地prepare语句时出现,直接在MySQL中执行拼接好的SQL语句则不会报错。 解…

    2025年12月11日
    000
  • MySQL排序还是PHP排序:处理海量数据时,哪个更快速有效?

    MySQL还是PHP?海量数据排序效率终极PK 处理巨量数据时,高效的排序至关重要。本文针对30万条记录规模的数据表,探讨MySQL排序和PHP排序的性能差异。 问题: 面对30万条记录,是先用MySQL排序再分页读取,还是直接读取所有记录后用PHP排序,哪种方法更高效? 立即学习“PHP免费学习笔…

    2025年12月11日
    000
  • MySQL索引失效:为何`shop_id`索引在数据量增多后失效?

    MySQL索引失效案例分析 本文分析一个实际案例,探讨MySQL索引失效的现象及原因。 数据库表结构如下: CREATE TABLE `ns_delivery_shop` ( `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, `goods_id` INT(…

    2025年12月11日
    000
  • Elasticsearch 7中LIKE语句是如何工作的?

    Elasticsearch 7 的 LIKE 语句详解 不同于 MySQL,Elasticsearch 7 的 SQL 语法在 LIKE 查询中具备更强大的子结构搜索能力。其核心原理基于以下几点: 强大的分词机制 Elasticsearch 利用高级分词器将文本内容拆分成独立的词条。此过程包含标准化…

    2025年12月11日
    000
  • MySQL高并发下如何优雅地处理重复昵称?

    MySQL 高并发环境下的重复昵称处理策略 在 MySQL 数据库中,高效处理高并发环境下的重复昵称问题至关重要。以下策略能够有效避免数据冲突和保证数据一致性: 方法一:使用唯一索引 创建唯一索引是处理重复昵称最直接有效的方法。 通过在 nickname 列上创建唯一索引,MySQL 数据库会自动阻…

    2025年12月11日
    000
  • MySQL排序还是PHP排序更有效?

    MySQL与PHP排序效率对比 处理包含大量数据的MySQL表排序时,开发者常采用PHP读取所有记录再排序的方法。然而,这种方法并非总是最佳选择。 MySQL排序的优势 MySQL利用索引进行排序,效率远高于PHP在内存中处理整个数据集。对于大规模数据,MySQL排序的效率优势显著。 立即学习“PH…

    2025年12月11日
    000
  • PHP中如何使用SQL_CALC_FOUND_ROWS高效分页并获取总记录数?

    PHP 中使用 SQL_CALC_FOUND_ROWS 实现高效分页和记录数统计 在 PHP 使用 MySQL 进行分页查询时,为了高效地获取总记录数,推荐使用 SQL_CALC_FOUND_ROWS。此方法能够在单次数据库操作中同时获取分页数据和总记录数。 使用方法示例 以下代码演示如何利用 SQ…

    2025年12月11日
    000
  • Appnode网站admin.php页面无法访问,如何解决?

    Appnode网站后台管理页面(admin.php)无法访问的解决方案 搭建Appnode网站后,常常遇到admin.php等后台管理页面无法访问的问题。 这通常由以下几个原因导致: 网站根目录设置错误: 请仔细检查您的网站根目录(Document Root)是否正确指向www文件夹。 错误的根目录…

    2025年12月11日
    000
  • Nginx proxy_pass如何使用正则表达式匹配变量进行代理?

    利用Nginx proxy_pass和正则表达式实现动态代理 本文介绍如何使用Nginx的proxy_pass指令结合正则表达式,实现根据域名动态转发请求到不同的后端服务器。 首先,通过正则表达式提取域名中的特定部分作为变量。例如,提取server_name中的二级域名: server_name ~…

    2025年12月11日
    000
  • MySQL如何计算给定时间点偏移130分钟后的每五分钟时间点?

    MySQL时间计算:精确计算时间偏移 本文探讨如何在MySQL中计算给定时间点偏移130分钟后的每五分钟时间点。我们将使用MySQL内置函数实现这一目标,无需借助其他编程语言。 方法 核心思路是先计算偏移后的起始时间,然后利用循环生成后续的每五分钟时间点。 计算偏移后的起始时间: 使用DATE_SU…

    2025年12月11日
    000
  • PHP 8如何进行数据库连接安全

    要安全地连接 PHP 8 数据库,需要保护凭据并防止 SQL 注入:使用预处理语句分离 SQL 查询和数据,以避免 SQL 注入。使用密码哈希存储密码,防止泄露。遵循最小权限原则,限制用户的数据库访问权限。使用 HTTPS 加密数据传输。验证用户输入,防止恶意数据进入。 PHP 8 数据库连接安全:…

    2025年12月11日
    000
  • 设计一个数字容器系统

    设计一个高效的数字容器系统,支持以下操作: 插入/替换: 将指定索引处的值替换为新值。如果索引不存在,则插入新值。查找最小索引: 返回给定数字在容器中出现的最小索引。如果数字不存在,则返回 -1。 挑战难度: 中等 相关主题: 哈希表,设计模式,最小堆(优先队列) 示例: [“NumberConta…

    2025年12月11日
    000
  • 与作曲家制作和共享PHP库

    Composer已成为PHP项目依赖管理和代码复用的核心工具。无论您是贡献开源项目还是提升个人开发效率,学习创建Composer包都是一项非常有价值的技能。本文将引导您完成构建和共享个人PHP库的完整流程。 准备工作 在开始之前,请确保您已具备以下条件: 扎实的PHP和Composer基础知识。已在…

    2025年12月11日
    000
  • 升级到PHP

    本文档记录了在Ubuntu系统上安装或升级PHP 8.2的步骤,希望能帮助到您和其他人。 首先,更新系统软件包列表: sudo dpkg -l | grep php | tee packages.txtsudo add-apt-repository ppa:ondrej/php # 按提示键入sud…

    2025年12月11日
    000
  • Laravel中的数据库迁移

    Laravel数据库迁移:高效管理数据库架构 Laravel凭借其优雅的语法和强大的功能,成为流行的PHP框架。其数据库管理系统尤为出色,包含查询构建器、Eloquent ORM和迁移功能。迁移功能允许开发者精确控制数据库模式,简化团队协作,并在不同环境中轻松维护数据库一致性。本文将深入探讨Lara…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信