Schema的优化和索引 - 范式和非范式
2009-09-02 00:00:00 来源:WEB开发网当使用缓存和汇总表,必须要决定是否要实时维护数据或者周期性重建数据。哪种更好完全取决与你的应用程序,但是周期性重建数据不仅仅可以节省资源,还可以使结果存放在更有效率的表中,这些表不会碎片并且含有完全排序的索引。
当你重建汇总和缓存表的时候,在操作的时候你常常需要它们的数据保持可见。你可以使用“shadow table”(影像表)来实现。当你已经创建它之后,你可以使用原子性的重命名来交换这些表。举个例子,如果你需要重建my_summary,你能创建my_summary_new,填充数据,把它和真正的表作交换。
mysql> DROP TABLE IF EXISTS my_summary_new, my_summary_old;
mysql> CREATE TABLE my_summary_new LIKE my_summary;
-- populate my_summary_new as desired
mysql> RENAME TABLE my_summary TO my_summary_old, my_summary_new TO my_summary;
在赋予新建表my_summary名之前,如果你把my_summary重命名为my_summary_old,你就可以保存这个表老的版本直到下次这个表的重建。如果新表出现问题,你也可以用旧的来替换。
计数表(Counter tables)
一个应用程序在一个表中存放计数字段,当更新计数字段的时候,会遇到并发问题。这些表在web应用程序中很常见。你能使用它们来缓存用户的好友数,文件的下载数等等。一般来说,创建一个单独的表来存放这些计数是个好的主意,这样做能使它更小更快。使用单独的表,可以避免无效的查询缓存并且让你使用更多的高级技术。
为了让例子更简单,假使你有个包含一列的计数表。来记录你网站的点击量。
mysql> CREATE TABLE hit_counter (
-> cnt int unsigned not null
-> ) ENGINE=InnoDB;
更多精彩
赞助商链接