参数化角色生成系统:从设计到实现的技术实践
2026/5/10 8:05:43
1.1 为什么不用哈希表?
1.2 B+树核心设计
1.3 磁盘IO才是瓶颈
2.1 最左前缀原则
(a, b, c)a=?、a=? and b=?、a=? and b=? and c=?b=?、c=?、b=? and c=?2.2 避免索引失效
WHERE age+1>20WHERE name LIKE '%张'WHERE varchar_col=123(应写’123’)WHERE a=1 OR b=2(若b无索引,全表扫描)2.3 索引选择性原则
2.4 覆盖索引优先
SELECT *→ 大概率回表查询SELECT 索引包含字段→ 无需回表,性能翻倍3.1 EXPLAIN命令必看字段
ref(索引访问),杜绝ALL(全表扫描)Using filesort、Using temporary3.2 联合索引优化技巧
WHERE a=? and b=?,排序ORDER BY c(a, b, c),同时优化查询和排序3.3 大数据分页优化
❌LIMIT 100000,20:先扫描100020行,再丢100000行
✅子查询优化:
SELECT * FROM table
INNER JOIN (
SELECT id FROM table
WHERE condition
ORDER BY index_field
LIMIT 100000,20
) AS tmp USING(id)
效果:100ms → 2ms,提升50倍
3.4 索引碎片定期维护
ALTER TABLE table REBUILD INDEX index_name3.5 杜绝过度索引
每个索引:写操作变慢 + 占用磁盘
排查无用索引:
SELECT * FROM sys.schema_unused_indexes;
维护成本:索引数不宜超过表字段数的30%
3.6 热点数据分离
4.1 隐式转换灾难
phone VARCHAR(20)WHERE phone = 13800138000(未加引号)4.2 联合索引顺序错误
(age, city)WHERE city='北京' AND age>254.3 OR条件未优化
查询:WHERE a=1 OR b=2
错误:仅a有索引
优化:改为UNION ALL:
SELECT * FROM table WHERE a=1
UNION ALL
SELECT * FROM table WHERE b=2
效果:5秒 → 0.1秒
现在行动起来:
数据库不会说谎,性能说明一切!
PS:在评论区说出你被索引坑得最惨的一次经历,点赞送《分布式索引设计精髓》电子书!