对于一个网站来讲,数据库的结构相当重要。即要利于存储(入库不阻塞),又要利于查询(查询不锁表)。网站数据库优化经验是一个积累的过程。下面就对多表关联查询的优化方法,举例说明。 mysql
如今社区分享类网站很火,就拿方维购物分享网站举例说明吧。也是对二次开发方维购物分享网站的一点总结,高手能够飞过。 sql
购物分享的关键表有:分享表、图片表、文件表、评论表、标签表、分类表等。
围绕分享的表就么多,哇,那也很多啊。当咱们查看一个图片的详细信息时,就要显示以上表里的信息。显示图片所属的分类、给图片打的标签、图片的评论、有文件的话还要显示文件下载信息等。难道让咱们6个表去关联查询嘛,固然不能这么多关联来查询数据,咱们能够只查询一个表便可,这怎么讲?这里分享表是主表,咱们能够在主表里创建一个缓存字段。好比咱们叫cache_data字段,赋予它text类型,这样能够存储很长的字符串,而不至于超过字段的最大存储。 数据库
这个缓存字段怎么用呢?在新增一条分享信息后,产生分享ID。若是用户发布图片或文件的话,图片信息入图片表,文件信息入文件表,而后把新产生的图片或文件信息写入到缓存字段里。一样的,若是用户有选择分类、打了标签的话,也把相应的信息写入到缓存字段里。对于评论而言,没有必要把所有评论存到缓存字段里,由于你不知道他有多少条记录,能够把最新的10条存到缓存字段里用于显示,这样缓存字段就变成一个二维或三维数组,序列化后存储到分享表里。 数组
array( 'img' = array( name => '123.jpg', url => 'http://tech.42xiu.com/123.jpg', width => 800, width => 600, ), 'file' = array( name => 'abc.zip', download_url => 'http://tech.42xiu.com/abc.zip', size => 1.2Mb, ), 'category' = array( 1 => array( id => 5, name => PHP乐知博客 ), 2 => array( id => 6, name => PHP技术博客 ), ), 'tag' => array( tag1 tag2 ...... ), 'message' => array( 1 => array(id, uid, name, content, time), 2 => array(id, uid, name, content, time), 3 => array(id, uid, name, content, time), 4 => array(id, uid, name, content, time), ), ) //好比,上面的数组结构,序列化存入数据库。 UPDATE share SET cache_data=mysql_real_escape_string(serialize($cache_data)) WHERE id=1;
这样查询就变得简单了,只须要查询一条就好了,取到缓存字段,把其反序列化,把数组信息提取出来,而后显示到页面。若是是之前那个结构,在几十万的数据量下,估计早崩溃了。数据缓存的方法也许不是最好的,若是你有更好的方法,能够相互学习,相互讨论。 缓存
本文由PHP乐知博客提供 http://tech.42xiu.com 学习