Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql数据库索引

从入门到精通MySQL 数据库索引(实战案例)

作者:hqxstudying

索引是数据库的目录,提升查询速度,主要类型包括BTree、Hash、全文、空间索引,需根据场景选择,建议用于高频查询、关联字段、排序等,避免重复率高或频繁更新字段,本文给大家介绍MySQL 数据库索引实战案例,感兴趣的朋友一起看看吧

一、索引是什么?能干嘛?

类比理解:索引就像书的目录。比如你想查《哈利波特》中 “伏地魔” 出现的页数,不用逐页翻书,直接看目录找关键词就行。数据库里的索引就是帮你快速找到数据的 “目录”。

核心作用:

二、索引的 4 种主要类型(附通俗例子)

1. BTree 索引(最常用的 “万能索引”)

适用场景:90% 的场景都能用,比如:

CREATE INDEX idx_age ON users(age);  -- 给年龄字段建索引

2. Hash 索引(“快速匹配器”)

3. 全文索引(“文本搜索神器”)

CREATE FULLTEXT INDEX idx_article ON articles(content);

4. 空间索引(“地图专用索引”)

三、啥时候该建索引?啥时候别建?

✅ 建议建索引的情况:

❌ 不建议建索引的情况:

四、复合索引:多个字段 “组队” 加速查询

1. 什么是复合索引?

CREATE INDEX idx_name_age ON users(name, age);

2. 最左前缀原则(必须掌握!)

WHERE name='张三' AND age=18;  -- 正确,用全索引
WHERE name='张三';  -- 正确,用name部分

不支持:

WHERE age=18;  -- 错误,跳过了name,索引失效
WHERE name='张三' AND age=18 AND address='北京';  -- 正确,address不影响,前两个字段用上索引

五、索引优化:让查询飞起来的技巧

1. 覆盖索引:“不回表” 的高效查询

-- 表结构:users(id, name, age)
CREATE INDEX idx_name_age ON users(name, age);  -- 索引包含name和age
SELECT name, age FROM users WHERE name='张三';  -- 直接从索引取数据,不用回表

2. 索引失效场景(避坑指南)

WHERE UPPER(name)='ZHANGSAN';  -- 对name做了大写转换,索引失效

类型不匹配

WHERE id='123';  -- id是数字类型,传字符串可能导致索引失效

模糊查询以通配符开头

WHERE name LIKE '%张三';  -- 无法用索引(不知道从哪开始查)

OR 条件分隔无关联字段

WHERE id=1 OR name='张三';  -- 若id和name没有共同索引,可能失效

3. 索引管理命令(常用)

创建索引

CREATE INDEX idx_name ON users(name);  -- 普通索引
CREATE UNIQUE INDEX idx_email ON users(email);  -- 唯一索引

删除索引

DROP INDEX idx_name ON users;

查看索引

SHOW INDEX FROM users;

分析查询是否用索引

EXPLAIN SELECT * FROM users WHERE name='张三';  -- 看执行计划中的Key列

六、不同引擎的索引差异(简单了解)

引擎支持的索引类型特点
InnoDBBTree、全文、空间数据和索引存一起(聚簇索引),适合事务
MyISAMBTree、全文、RTree索引和数据分开存,不支持事务
MemoryHash、BTree数据在内存,查询极快,但重启数据丢失

七、实战案例:电商订单表索引优化

场景:

查询 “近 30 天内,已支付(status=2)且金额> 1000 的订单”,按时间倒序。

表结构:

CREATE TABLE orders (
  id BIGINT PRIMARY KEY,
  user_id BIGINT,
  order_time DATETIME,
  status TINYINT,
  amount DECIMAL(10,2)
);

优化方案:

创建联合覆盖索引

CREATE INDEX idx_status_time_amount ON orders(status, order_time, amount);

查询语句

SELECT id, user_id, amount FROM orders 
WHERE status=2 AND order_time >= NOW() - INTERVAL 30 DAY AND amount > 1000
ORDER BY order_time DESC;

优化原理:

八、索引使用的核心原则(必记!)

通过合理设计索引,MySQL 查询性能能提升 10-100 倍!但记住:索引不是越多越好,要在 “查询速度” 和 “写入速度” 之间找平衡哦~

到此这篇关于一文掌握MySQL 数据库索引详解的文章就介绍到这了,更多相关mysql数据库索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文