当前位置:首页 >  站长 >  数据库 >  正文

MySQL索引为什么不生效:六个写法让EXPLAIN当场现形

 2026-08-27 15:22  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

明明建了索引,查询还是全表扫描,几百万行的表一查十几秒。索引失效多数不是索引的问题,是SQL写法的问题。别猜,EXPLAIN一下,type列是不是ALL、key列是不是NULL,一目了然。

EXPLAIN SELECT * FROM orders WHERE DATE(create_time) = '2026-08-20';
-- type=ALL 全表扫描:函数包住了索引列,索引失效

EXPLAIN SELECT * FROM orders
WHERE create_time >= '2026-08-20 00:00:00'
AND create_time < '2026-08-21 00:00:00';
-- 改成范围写法,type=ref/range,索引正常

失效场景一共有几类常见的:索引列上套函数或做运算;like以百分号开头;隐式类型转换(varchar列用数字比较);联合索引不满足最左前缀;or两侧有一边没索引;负向条件not in、!=在多数场景放弃索引。

-- 隐式转换:user_id是varchar,传数字,索引失效
EXPLAIN SELECT * FROM users WHERE user_id = 10086;
EXPLAIN SELECT * FROM users WHERE user_id = '10086'; -- 加引号才走索引

-- 最左前缀:联合索引(a,b,c)
EXPLAIN SELECT * FROM t WHERE b = 1 AND c = 2; -- 不走,缺了a
EXPLAIN SELECT * FROM t WHERE a = 1 AND c = 2; -- 部分走(a)
EXPLAIN SELECT * FROM t WHERE a = 1 AND b = 2; -- 全走(a,b)

读EXPLAIN抓重点就行:type从好到差大致是const、eq_ref、ref、range、index、ALL,出现ALL就该处理;rows预估扫描行数过大也是信号;Extra里出现Using filesort和Using temporary说明排序临时表压力不小,多半要调整索引或写法。

养成习惯:上线的每条核心SQL先跑一遍EXPLAIN,慢查询日志里捞出来的语句逐条过。索引这东西建了不用白占写入性能,用了不生效等于没建,EXPLAIN是唯一裁判。

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关标签
mysql

相关文章

  • 网站数据自动备份:一个脚本+一个计划任务搞定

    网站备份是出事之后最后悔没做的东西。很多人服务器被黑后才发现数据库没备份,几年的内容一夜归零。其实一个shell脚本加一个定时任务就能解决。下面这个脚本同时备份MySQL数据库和网站源码,按日期命名,保留最近7天。Linux服务器直接放到/root/backup.sh,Windows可以改成Powe

    标签:
    数据备份
    mysql
  • MySQL慢查询定位三板斧:慢日志+EXPLAIN+索引

    网站卡顿不一定是代码慢,很可能是数据库在硬扛。MySQL慢查询日志是最直接的突破口,先把执行时间长的SQL抓出来,再一条条用EXPLAIN看执行计划,最后加索引或者改写法。开启慢日志很简单,在my.cnf里加三行,重启MySQL即可。注意long_query_time单位是秒,线上可以先设1秒,抓到

    标签:
    mysql
    网站优化
  • MySQL5.7 集群配置的步骤

    这篇文章主要介绍了MySQL5.7集群配置的步骤,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下

    标签:
    mysql
  • MySQL中触发器和游标的介绍与使用

    这篇文章主要给大家介绍了关于MySQL中触发器和游标的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    标签:
    mysql
  • MySQL中exists、in及any的基本用法

    这篇文章主要给大家介绍了关于MySQL中exists、in及any的基本用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    标签:
    mysql

热门排行

信息推荐