Mysql 索引的一些

概念和样例

复制代码
CREATE INDEX idx_name_age ON user(name, age);

新建一个 B+Tree 文件(独立于原始表)---- 索引树

只存储索引字段:name + age + 主键 ID

按 name 排序组织数据
InnoDB 的二级索引(非主键索引)会自动包含主键 ID

二级索引需要通过主键 ID 回表查完整数据,所以自动带主键 ID

索引树

如果表结构是这样的:

复制代码
ID=1, name='张三', age=25, phone='138xxx'
ID=2, name='李四', age=30, phone='139xxx'
ID=3, name='张三', age=28, phone='137xxx'

索引树 (idx_name_age) 的存储结构:

✅ 索引树里只有 name、age、主键 ID

没有 phone、address 等其他字段

✅ 按 name 字典序排列,查找极快

场景 1:覆盖索引(不用回表)

场景2:需要回表

主键索引树(聚簇索引)

回表 = 从二级索引树跳到主键索引树的过程。

复合索引

之前创建了单个索引,进行查询的时候,没有命中索引

改成复合索引

ALTER TABLE a

ADD INDEX idx_recharge_pay_status (字段一, 字段二, 字段三);

注意最左前缀匹配原则

虽然创建了 但还是有可能出现走全表查询,是因为

支付状态 IN ('支付', '已退款') 选择性太低

如果你的表里 80%+ 的订单都是已支付或已退款状态

MySQL 认为:走索引要回表几十万次,不如直接全表扫描

如果我的sql中的where 里面的字段顺序和创建索引的顺序不一样会怎么办

MySQL 的查询优化器会:

解析 SQL:提取所有 WHERE 条件

重新排序:按索引列顺序重新排列条件

选择执行计划:使用最优索引

但最好还是在代码层面保持一致。

相关推荐
YHHLAI18 分钟前
SQL 完全指南:从入门到精通
数据库·sql
oradh1 小时前
Oracle enq: TX - index contention 锁等待事件问题排查总结
数据库·oracle·oracle enq tx·enq tx index
CDN3601 小时前
爬虫把价格库扒光、SQL注入打穿数据库?360CDN WAF规则引擎深度定制,把防护精度拉到逐字段级
数据库·爬虫·sql
数据库小学妹3 小时前
MySQL长事务复盘:Sleep连接、MDL排队与undo滞留
运维·数据库·mysql
计算机毕设定制辅导-无忧学长3 小时前
基于Spring Boot的玄幻小说个性化推荐平台设计与实现
java·vue.js·spring boot·后端·mysql·推荐算法
半摆烂日常4 小时前
自建WMS和买成品:三年成本对比
大数据·服务器·数据库·python·深度学习·低代码·numpy
风123456789~4 小时前
【架构专栏】第6章 数据库设计基础知识 1/4
数据库·架构
Nturmoils4 小时前
异构数据同步不只追延迟:用 KFS 守住不停机迁移的每一笔账
数据库
星星落进兜里4 小时前
Redis 内存缓存,面试补充
数据库·redis·面试
棣廷5 小时前
初识MySQL——DQL数据查询语言详解
数据库·mysql