x
有索引后发生了什么
执行:
1 | CREATE INDEX idx_users_email ON users(email); |
数据库会单独建一张索引目录表:
把所有 email提前排序,并记录好每行数据在磁盘的位置。
结构类似这样:
1 | email字段(已排序) 数据物理位置 |
查询时变成了:
- 去索引目录里用二分查找
- 有序数据里找目标 email,不用逐条遍历
- 找到后直接拿物理位置,定位到原表那一行
100 万条数据:
- 全表扫描:最坏扫 100 万次
- 索引二分查找:只要 20 次左右 就找到了
速度差距是几万倍。
1 | CREATE TABLE users ( |
numeric(10,2)
高精度小数,最多 10 位数字,保留 2 位小数,和 decimal(10,2) 作用一样,适合存金额。
为什么要 “快照”?
举个真实场景:
- 今天:手机卖 1000 元,用户下单
- 明天:商家把手机改成 1200 元
如果不存快照:
订单查价格时直接读商品表 → 订单价格也变成 1200,用户就亏了,对账全乱了。
有了商品金额快照:
下单时把 1000 存到订单里,永远是 1000,商品涨价降价都不影响旧订单。
如有错误,多多指教