-
我明明给表建了联合索引,有些查询却还是慢得像全表扫描,EXPLAIN 一看根本没走索引,因为我的查询条件不符合最左前缀:一次数据库联合索引最左前缀的深度复盘
我有张订单表,经常按用户、状态、时间查,于是建了个联合索引 (user_id, status, created_at),以为这几个字段的查询都能走它、飞快。可线上有些查询慢得像全表扫描,EXPLAIN 一看傻眼:它们根本没走这个联合索引(type=ALL)。那些慢查询要么只按 status 查(没带最左的 user_id),要么 status+created_at(跳过了 user_id)。查清才…- 0
- 0
-
一个 varchar 手机号字段被用数字去查,MySQL 偷偷做隐式类型转换让索引彻底失效:一次慢查询拖垮数据库的深度排查与类型对齐正解
phone 字段是 varchar 且建了索引,一条 WHERE phone = 13800138000(少了引号,数字)却全表扫描三百多万行、跑了 8 秒、把数据库 CPU 打满。根因是 MySQL 隐式类型转换:字符串和数字比较时,它把字符串列转成数字,等于对每行 phone 做 CAST 运算,索引随之失效。本文从 EXPLAIN 看出 type=ALL/key=NULL 讲起,剖析隐式转换…- 0
- 0
-
我给查询字段建好了索引,一条简单的查询却慢得离谱,EXPLAIN 一看竟然全表扫描根本没走索引,我对着在索引列上用函数和隐式类型转换让索引失效这个坑排查大半天的复盘
一个让我对数据库索引从迷信到敬畏的经典坑,崩溃在索引明明就在那、查询条件明明用了那个建了索引的字段,数据库却视而不见去全表扫描。慢查询告警:users 表几百万行,phone 字段 varchar 上早建好索引 idx_phone,按手机号查的接口平时飞快,那天突然几百毫秒甚至上秒。SQL 简单得不能再简单:SELECT * FROM users WHERE phone = 13800138000…- 4
- 0
-
我给表建了 a、b、c 的联合索引,以为查这三列里哪一个都能走索引,结果按 b 单独查时全表扫描慢成狗,我对着最左前缀排查了大半天的复盘
我给一张大表建了 (a,b,c) 的联合索引,想当然以为查 a、查 b、查 c 都能用上它,结果上线后按 b 单独过滤的查询慢得要命,EXPLAIN 一看 type=ALL、key=NULL,索引完全没生效、走的全表扫描。我对着这个"明明建了索引却用不上"的现象排查了大半天,才彻底搞懂联合索引的最左前缀原则:(a,b,c) 这个索引,是先按 a 排序、a 相同再按 b、b 相同…- 2
- 0
-
我的查询明明在手机号字段上建了索引,却慢得像在全表扫描,EXPLAIN 一看果然没走索引,折腾半天发现罪魁祸首竟是一个隐式类型转换的深度复盘
一张几百万行的用户表,我早早在 phone 字段建了索引,可"按手机号查用户"的 SQL 慢得动辄上千毫秒,跟全表扫描没区别。我一度想重建索引、加配置,最后老老实实 EXPLAIN 一看:type=ALL、key=NULL,根本没走索引!细看才发现:phone 是 varchar,我却写成 WHERE phone = 13800138000 把它当数字传了。MySQL 比较字符…- 0
- 0
-
一条 WHERE phone = 13800138000 漏了引号的查询,让 2000 万行的表全表扫描拖垮数据库:我在 MySQL 里栽进隐式类型转换让索引失效的深夜告警复盘
凌晨一点告警炸响:数据库 CPU 打满、接口大面积超时。慢查询日志里一条 SELECT ... WHERE phone = 13800138000 执行要 8 秒——phone 明明建了索引,EXPLAIN 却显示全表扫描 2000 万行。真凶是我把手机号写成了数字而非字符串:varchar 字段遇上数字常量,MySQL 会把每一行字段都做隐式类型转换,等于对索引字段做函数运算,索引彻底失效。这篇…- 2
- 0
-
明明有索引却全表扫描:索引失效避坑复盘
那次事故把我对我明明建了索引啊这句话的信心彻底击碎了:一个按手机号查询用户的接口上线一年多一直稳稳的响应几毫秒,突然某天开始偶发性地慢到好几秒甚至超时。SQL 简单到不能再简单,就是 WHERE phone = ?,而 phone 字段上我清清楚楚建了索引,一个走索引的等值查询几百万行的表里也该毫秒级返回,怎么会慢到几秒?真正让我脊背发凉的是把这条慢 SQL 拿去 EXPLAIN 的那一刻——它居…- 0
- 0
-
测试秒回上线却超时:MySQL 索引为何悄悄失效
一条订单查询,开发时毫秒返回,测试环境秒回验收一路绿灯,上线没几周却动辄八九秒甚至超时——而代码和 SQL 一个字都没改。登上服务器一看,CPU、连接数都正常,唯独慢查询日志里它赫然在列;在前面加上 EXPLAIN 才心里咯噔一下:type 是 ALL、rows 几百万、key 那栏空空如也,明明建了索引却压根没走,老老实实把整张表从头扫到尾。真凶经典得让我有点不好意思:字段是 varchar 存…- 0
- 0
-
一条慢 SQL 打满数据库:那些让你索引白建的失效陷阱
一个普通的下午,接口突然集体超时,数据库 CPU 被打满到 100%,而 QPS 看起来一切正常。揪出凶手只用了一条 EXPLAIN——一条平时几毫秒的查询变成了十几秒的全表扫描,明明建了索引却纹丝不动。从那次事故出发,这篇文章把索引失效的六大陷阱、EXPLAIN 怎么读、联合索引最左前缀、覆盖索引、深分页优化到慢查询日志监控,一次讲透。- 3
- 0
-
MySQL 索引优化实战:看懂 EXPLAIN,慢查询从 3 秒到 30 毫秒
一张订单表数据涨到两千万行后,一个按用户查最近订单的普通查询突然慢到三秒多,我第一反应是加索引,结果还是慢一秒多。那天我用 EXPLAIN 把它摊开,顺着 B+ 树、聚簇索引与二级索引的回表、覆盖索引、联合索引的最左前缀一路啃下来,最后靠建对一个索引把查询压到三十毫秒。从读懂 EXPLAIN 的 type/key/rows/Extra,到回表与覆盖索引、最左前缀、索引失效的函数与隐式转换与 LIK…- 0
- 0
-
MySQL 慢查询从定位到根治:索引失效、深分页、长事务的排查与优化清单
一套跑了四五年、订单表从几十万行涨到三千多万行的分析库,一条 WHERE DATE(created_at)=CURDATE() 的汇总查询因为在索引列上套了函数而退化成全表扫描,单条 SQL 从设计期的几毫秒涨到线上 18 秒,高并发下迅速占满连接池让整块经营看板瘫痪。这篇不写成「几个人熬了多少天打了多少仗」的流水账,而是整理成一份能直接照着查的慢查询治理清单:先用慢查询日志(long_query…- 0
- 0
-
PostgreSQL 性能优化完全指南:从一次"1.2 亿行 orders 表加 30 个索引反而更慢 CPU 95% 高峰打挂"看懂为什么加索引远远不够
2023 年我们接手一个老电商系统的性能优化任务数据库是 PostgreSQL 14 主表 orders 1.2 亿行 products 800 万行 users 500 万行前端反馈商品搜索加订单查询慢到无法忍受 P99 5 秒起步高峰期数据库 CPU 95% 经常被打挂前任 DBA 留下的字典是加索引就行看慢日志哪个表慢就加我们照着做了一周加了 30 多个索引情况非但没好转反而更糟写入变慢磁盘…- 2
- 0
-
PostgreSQL 索引调优完全指南:从一次"500GB CRM 库核心查询 30 秒大客户列表页崩溃"看懂为什么 CREATE INDEX 远远不够
2023 年我们接手一个 SaaS CRM 系统用 PostgreSQL 14 业务起来后客户数据库从 10GB 涨到 500GB 一些核心查询从 50ms 慢慢恶化到 30 秒大客户列表页要等半分钟才出来客户投诉一通接一通我们老板拍板说加索引我们也就加索引这一加发现完全不是 CREATE INDEX 一句话的事加完该慢的还慢不该慢的反而慢了业务直接更崩然后我们陆续踩了一堆坑第一种最让我傻眼我们看…- 0
- 0
-
PostgreSQL 索引调优完全指南:从一次"加了一堆索引反而更慢"看懂为什么 B-tree 不是万能的
2023 年我负责一个内部数据平台底层用 PostgreSQL 库里几张核心表都过亿行业务跑了半年一切都还稳直到运营某天上线一个新功能要按用户加时间段加状态组合查订单单次查询时间从 200 毫秒涨到了 12 秒慢查询日志一片红我盯着那几条 SQL 心里很笃定加个索引就完事了于是我对着 where 条件几乎每个字段都建了一个 B 树索引以为这下稳了可等真上线一串问题冒了出来第一种最先把我打懵索引建完…- 0
- 0
-
慢 SQL 优化完全指南:从一次"加了索引 EXPLAIN 也显示用了索引,查询却还是慢"看懂执行计划
2022 年我接手优化一个订单系统的慢查询运营后台有个订单列表页打开要十几秒怎么让它快起来这件事我压根没多想第一版我做得很顺手慢就是因为没索引嘛我看了一眼那条 SQLWHERE 条件里用到了 user_id 和 status 那我就给这两列各加一个索引改完一测真不错列表页快了我心里挺踏实SQL 优化嘛不就是看哪列没索引补上就行可等这优化上了生产数据量真正涨上来一串问题冒了出来第一种最先把我打懵我明…- 2
- 0
-
数据库慢查询优化完全指南:从一次"数据量一大接口就卡死、加了索引却没用"看懂慢查询治理
2021 年我做一个电商后台有一个订单列表接口。第一版我做得很省事写一句 SQL 把订单查出来按时间倒序分页返回。开发期和测试环境我测了测真不错翻页飞快几十毫秒就返回。我心里很踏实查数据库嘛写条 SQL 查出来就行了真慢了给条件列加个索引不就快了。可等这个系统真正上线订单表的数据从几万行涨到几百万行一串问题冒了出来。第一种最先把我打懵数据量一大这个列表接口直接卡死一次查询要几十秒接口频频超时。第二…- 5
- 0
-
数据库索引完全指南:从一次"加了索引查询还是慢、EXPLAIN 一看根本没走索引"看懂索引优化
2021 年我负责一个订单系统。订单表 orders 已经有几百万行。有个查我的订单的接口越来越慢从几百毫秒一路劣化到好几秒。我看了下它执行的 SQL 是按 user_id 过滤再按 create_time 倒序。我想当然地判断慢无非是没索引加一个就好了。我在 user_id 上建了索引信心满满地上线还是慢。我又想可能 create_time 也得有索引再加一个还是慢。我甚至把 user_id s…- 0
- 0
EXPLAIN
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!

















