MySQL Schema设计(一)范式不能当'范'吃
● Join成本,表关联开销大,内存IO消费尤为突出
● 增加了系统可扩展性的复杂度
基于静态数据的冗余
静态数据指相关字段变更频率不高,如用户资料,可作冗余字段
以消息表为例
Fuid,Tuid,Msg,Dateline
范式化设计后,在内容呈现上可能需要涉及多表关联,因为用户想知道发消息的人是谁?
那么,可增加冗余字段:Funame
② 基于谓词的冗余
有些where连接条件很热门,一个谓词为多个SQL服务,那么,我们可以把这些热门的谓词收集,集中存在到一张冗余表
以用户登录为例子,假设有上亿条用户资料并做了分表处理,用户只关心uname,根据uname需要到各个分表去查询uid,此时,我们可按:uname,uid建立冗余表
③ 基于聚会函数的冗余
频繁的count,max,sum等需求,例如,论坛今日发帖总量,可建立冗余字段Spost
④ 基于排序的冗余
索引用来加速查询或者已经是件家喻户晓的事,但还有一个优势,即:降低排序成本。
仍然以消息表为例,若我们按uname对消息做排序的代价估计会蛮高的,但如果在消息表里把uname冗余并且建立好索引,则可以借助索引来抵消排序
mysql > SELECT title,actor_name
-> FROM film
-> INNER JOIN actor ON film.actor_id=actor.id
-> WHERE actor.area='AMERICA'
-> ORDER BY film.published DESC LIMIT 10;mysql > SELECT title,actor_name
-> FROM actor_film
-> WHERE area='AMERICA'
-> ORDER BY film.published DESC LIMIT 10;那么,我们便可利用复合索引同时完成排序和过滤,一石二鸟。存在即合理,对反范式的适度使用,关键在于判断业务之间的耦合性。
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。