上一篇
场景引入:
某天,程序员小张发现公司后台系统越来越慢,用户投诉页面加载要等10秒以上 😫,排查后发现,核心的订单查询SQL居然要扫描全表200万条数据!这时候,DBA老王拍了拍他肩膀:"小伙子,该加索引了!"
想象一下,一本没有目录的百科全书 📚,要查某个知识点只能一页页翻——这就是没有索引的数据库表,而索引就像书的目录,能让你快速定位数据,特别是当表数据量超过10万行时,效果立竿见影!
索引的典型收益:
-- 单列索引(最常用) CREATE INDEX idx_user_name ON users(name); -- 多列联合索引(注意顺序影响查询效率) CREATE INDEX idx_order_status_date ON orders(status, create_time);
💡 适用场景:已存在的表需要新增索引,不影响业务运行。
-- 添加普通索引 ALTER TABLE products ADD INDEX idx_price(price); -- 添加唯一索引(防止重复值) ALTER TABLE employees ADD UNIQUE idx_email(email); -- 添加主键索引(如果表没有主键) ALTER TABLE logs ADD PRIMARY KEY(id);
🌟 优势:一条语句可同时添加多个索引,适合初始化表结构时使用。
CREATE TABLE articles ( id INT AUTO_INCREMENT, VARCHAR(100), content TEXT, author_id INT, PRIMARY KEY (id), -- 主键索引 INDEX idx_title (title), -- 普通索引 UNIQUE INDEX idx_author_title (author_id, title) -- 联合唯一索引 );
🛠️ 最佳实践:新项目建表时就应该规划好索引。
-- 支持文本内容的模糊搜索优化 ALTER TABLE news ADD FULLTEXT INDEX ft_content(content); -- 使用MATCH AGAINST查询 SELECT * FROM news WHERE MATCH(content) AGAINST('数据库优化');
📝 注意:仅适用于MyISAM和InnoDB引擎(MySQL 5.6+)。
-- 为地理坐标数据创建索引 ALTER TABLE locations ADD SPATIAL INDEX pt_index(coordinates);
🌍 特殊用途:处理地图、经纬度等空间数据。
不要过度索引
最左前缀原则
-- 联合索引 (A,B,C) 生效场景: WHERE A=1 AND B=2 -- ✅ 生效 WHERE B=2 AND C=3 -- ❌ 不生效
索引失效的常见情况
LIKE '%关键字%'
(前导通配符) WHERE YEAR(create_time)=2025
EXPLAIN SELECT * FROM users WHERE age > 25;
查看结果中的 type 和 key 字段,确认是否命中索引。
-- 开启慢查询日志(2秒以上查询) SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 2;
-- 计算字段的选择性(越接近1越好) SELECT COUNT(DISTINCT city)/COUNT(*) FROM customers;
选择性 > 0.1 的字段才适合建索引
根据2025年MySQL 8.3的更新:
CREATE INDEX idx_desc ON accounts(balance DESC);
ALTER INDEX idx_test INVISIBLE;
索引是数据库的"加速器",但需要科学使用:
ANALYZE TABLE
更新统计信息 小张听完后,给订单表加上了
(user_id, status)
联合索引,查询时间从8.2秒降到了0.03秒,老板终于露出了笑容 😎。
(完)
本文由 邢水丹 于2025-07-29发表在【云服务器提供商】,文中图片由(邢水丹)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/473949.html
发表评论