mark---[mysql多表关联查询的优化方法]

对于一个网站来说,数据库的结构至关重要。即要利于存储(入库不阻塞),又要利于查询(查询不锁表)。网站数据库优化经验是一个积累的过程。下面就对多表关联查询的优化方法,举例说明。

现在社区分享类网站很火,就拿方维购物分享网站举例说明吧。也是对二次开发方维购物分享网站的一点总结,高手可以飞过。

购物分享的关键表有:分享表、图片表、文件表、评论表、标签表、分类表等。

围绕分享的表就么多,哇,那也不少啊。当我们查看一个图片的详细信息时,就要显示以上表里的信息。显示图片所属的分类、给图片打的标签、图片的评论、有文
件的话还要显示文件下载信息等。难道让我们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;

这样查询就变得简单了,只需要查询一条就行了,取到缓存字段,把其反序列化,把数组信息提取出来,然后显示到页面。如果是以前那个结构,在几十万的数据量下,估计早崩溃了。数据缓存的方法也许不是最好的,如果你有更好的方法,可以相互学习,相互讨论。

时间: 2024-10-03 14:06:36

mark---[mysql多表关联查询的优化方法]的相关文章

MySQL多表关联查询效率高点还是多次单表查询效率高,为什么?

MySQL多表关联查询效率高点还是多次单表查询效率高,为什么? <阿里巴巴JAVA开发手册>里面写超过三张表禁止join 这是为什么?这样的话那sql要怎么写? 原文地址:https://www.cnblogs.com/gotodsp/p/10090382.html

MySQL多表关联查询与存储过程

1.多表关联查询 --  **************关联查询(多表查询)**************** -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 1.1 交叉连接查询(不推荐.产生笛卡尔乘积现象:4 * 4=16,有些是重复记录) SELECT empName,deptName FROM employee,dept; -- 需求:查询员工及其所在部门(显示员工姓名,部门名称) -- 多表查询规则:1)确定查询哪些表   2)确定查询哪些字段   3)表与表之间连接条件

JDBC MySQL 多表关联查询查询

public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root",""); String sql ="select

[MySQL]多表关联查询技巧

示例表A: author_id author_name 1 Kimmy 2 Abel 3 Bill 4 Berton 示例表B: book_id author_id start_date end_date 9 1 2017-09-25 21:16:04 2017-09-25 21:16:06 10 3     11 2 2017-09-25 21:21:46 2017-09-25 21:21:47 12 1     13 8     示例表C: order_id book_id price or

Mysql多表关联查询,有索引和没索引的差距

下面简单的用个实例来介绍,索引在多表查询中有多关键! 一.没有索引时同步数据: 1.查询代码如下(关联了九次): 2.运行耗时(2分多钟,数据大概只有一万条): 1 Start sync MysqlData:---------------------------时间:2016-12-01 08:50:00 2 Success sync MysqlData:-------------------------同步数据成功!:2016-12-01 08:52:37 二:有索引时同步数据 1.给数据库脚

oracle02--多表关联查询

1. 多表(关联)查询 多表查询也称之为关联查询.多表关联查询等,主要是指通过多个表的关联来获取数据的一种方式. 1.1. 多表映射关系 一对多:A表的一行数据,对应B表中的多条.如:一个部门可以对应多个员工. 多对一:B表中的多条对应A表的一行数据.如:多个员工对应一个部门. 多对多:学生和选修课表----学生和课程对应表. 一对一:人员基本信息和人员信息扩展表. 1.2. 笛卡尔集 笛卡尔集对于我们数据库的数据查询结果的影响: 1. 数据冗余.---笛卡尔集并不是我们所需要的数据. 2. 效

高性能mysql 第六章查询性能优化 总结(上)查询的执行过程

6  查询性能优化 6.1为什么查询会变慢 这里说明了的查询执行周期,从客户端到服务器端,服务器端解析,优化器生成执行计划,执行(可以细分,大体过程可以通过show profile查看),从服务器端返回客户端结果. 而执行部分作为最重要的一环,需要做的事情比较多,而不合适的query往往让执行过程做了不必要的操作,或者不能使用更优秀的底层数据结构,从而用时更久. 6.2慢查询基础:优化数据访问 访问数据量多大,超过实际所需是慢查询的一个原因.导致这种情况的原因大致有两个 1.应用程序向mysql

MySQL如何执行关联查询

MySQL中‘关联(join)’ 一词包含的意义比一般意义上理解的要更广泛.总的来说,MySQL认为任何一个查询都是一次‘关联’ --并不仅仅是一个查询需要到两个表的匹配才叫关联,索引在MySQL中,每一个查询,每一个片段(包括子查询,设置基于表单的select)都可能是关联. 所以,理解MySQL如何执行关联查询至关重要.我们先来看一个union 查询的例子.对于union查询,MySQL先将一系列的单个查询结果放到一个临时表中,然后再重新读出临时表数据来完成union查询.在MySQL的概念

Mysql中的关联查询(内连接,外连接,自连接)

Mysql中的关联查询(内连接,外连接,自连接) 在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询 一,内连接查询 是指所有查询出的结果都是能够在连接的表中有对应记录的. 以t_employee(员工表)和t_dept(部门表)为例: t_employee表中的记录如下:dept代表该员工所在的部门 t_dept表中记录如下: 可以发现,其中人力资源部里没有员工(这里只是举例,可能与实际不符