上一篇
场景引入:
凌晨3点,你被报警短信惊醒——公司订单查询接口响应时间突破5秒!💥 登录服务器一看,发现核心订单表的全表扫描像蜗牛一样拖垮了整个系统,这时候才明白,没好好设计索引的数据库,就像没装导航仪的跑车...
VARCHAR(255)
:根据实际长度设定(如手机号VARCHAR(20)
) INT
存IP比VARCHAR
快3倍(通过INET_ATON()
转换) DATETIME
和TIMESTAMP
选错时区会出大事 ENUM
类型比VARCHAR
节省40%空间(适合固定选项如性别) -- 正确姿势 ✅ CREATE INDEX idx_user_phone ON users(phone, status); -- 翻车案例 🚑 CREATE INDEX idx_all ON users(name,age,phone,address...); -- 索引列过多=无效索引
user_id
+order_status
组合) ORDER BY create_time DESC
) ⚠️ 最左前缀原则:
INDEX(a,b,c)
只能加速:
WHERE a=1
WHERE a=1 AND b=2
WHERE b=2
WHERE c=3
原表问题:
SELECT * FROM orders WHERE user_id=10086 AND status='paid' ORDER BY create_time DESC; -- 耗时2.8秒
优化方案:
-- 创建联合索引(注意字段顺序!) ALTER TABLE orders ADD INDEX idx_user_status_time(user_id, status, create_time); -- 查询速度提升至0.02秒 🚀
死亡写法:
SELECT * FROM products WHERE name LIKE '%手机%'; -- 全表扫描警告!
救赎方案:
-- 改用全文索引(适合大文本搜索) ALTER TABLE products ADD FULLTEXT INDEX ft_idx_name(name); SELECT * FROM products WHERE MATCH(name) AGAINST('+手机' IN BOOLEAN MODE);
选择性 = 不重复值数量 / 总行数
NOT IN
会让索引失效 WHERE YEAR(create_time)=2025
无法命中索引 WHERE phone=13800138000
(phone是字符串类型时) EXPLAIN命令:
EXPLAIN SELECT * FROM users WHERE age>18; -- 关注type列:const > ref > range > index > ALL
慢查询日志:
# my.cnf配置 slow_query_log = 1 long_query_time = 1 # 记录超过1秒的查询
:
设计数据库就像装修房子🏠,索引是隐藏的电路系统——
(本文基于2025年8月主流数据库版本验证)
本文由 战新梅 于2025-08-04发表在【云服务器提供商】,文中图片由(战新梅)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/530435.html
发表评论