场景引入:
凌晨3点,你正喝着第5杯咖啡☕,突然发现后台报表查询卡了10分钟还没出结果——用户投诉电话已经打爆了!这时候才明白:没加索引的SQL,就像让数据库在图书馆里摸黑找书📚… 别慌,今天手把手教你用索引让查询飞起来!
想象一下:
MySQL索引本质是数据的快捷目录(B+树结构),能将查询速度从O(n)提升到O(log n),实测百万数据量下,合理索引能让查询从5s→0.01s!
ALTER TABLE users ADD INDEX idx_name (username); -- 给username加索引
适用场景:高频查询的非唯一字段,如商品名称、用户昵称
CREATE UNIQUE INDEX uni_email ON users(email); -- 确保邮箱不重复
特点:自动校验数据唯一性,比普通索引略慢
ALTER TABLE orders ADD PRIMARY KEY (order_id); -- 默认自带的主键
冷知识:InnoDB的表数据文件本身就是按主键组织的B+树!
CREATE INDEX idx_name_age ON employees(last_name, age);
生效案例:
SELECT * FROM employees WHERE last_name='张'; -- ✅ 命中索引 SELECT * FROM employees WHERE age=30; -- ❌ 不命中(违反最左原则)
EXPLAIN SELECT * FROM products WHERE price > 100;
重点看:
ALL
(全表扫描)→ 赶紧加索引! ❌ 致命操作:
SELECT * FROM users WHERE LEFT(username,3)='abc'; -- 函数操作 SELECT * FROM users WHERE age+10 > 30; -- 表达式计算
✅ 正确姿势:
SELECT * FROM users WHERE username LIKE 'abc%'; -- 用左前缀匹配
-- 普通查询(需回表查数据) SELECT * FROM orders WHERE user_id=123; -- 覆盖索引优化(只需读索引) CREATE INDEX idx_user_status ON orders(user_id, status); SELECT user_id, status FROM orders WHERE user_id=123;
实战建议:
ANALYZE TABLE
更新统计信息 MySQL 5.6+的黑科技:
-- 传统方式:先按name过滤→回表→再过滤age -- ICP优化:在索引层同时过滤name和age SELECT * FROM users WHERE name LIKE '张%' AND age=25;
即使不满足最左前缀,也可能利用组合索引:
CREATE INDEX idx_gender_age ON employees(gender, age); SELECT * FROM employees WHERE age=30; -- 8.0+可能触发扫描
索引不是银弹,但绝对是SQL优化的第一板斧🪓!下次当你面对慢查询时,记得:
(2025-07最新实测:某电商系统通过优化索引,订单查询速度提升47倍!)
思考题:如果你的评论区表需要按用户ID+时间
高频查询,该怎么设计索引? 🤔
本文由 树若星 于2025-07-31发表在【云服务器提供商】,文中图片由(树若星)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/496886.html
发表评论