Mysql多字段关联单字段利用GROUP_CONCAT巧妙处理

本文介绍了如何解决SQL查询中多字段关联导致的性能问题。通过查看项目日志,发现循环查询导致页面加载缓慢。博主分析数据结构后,针对一对多关系的gameinfo和gamelabel表,运用GROUP_CONCAT函数结合JOIN进行优化,减少了查询时间和SQL复杂度。最终优化后的执行时间约为0.23秒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前做的一个项目,这段时间看首页访问速度比较慢,想看看那里有问题,需要优化一下,于是查看日志看到这个:

上图很明显,某个程序在循环查询数据库。可能是项目比较着急,所以没有注意优化,先写出来在说。最后随着数据量的越来越大,页面也就越来越卡了。可以看到基本是遍历查询的SQL语句查询时间不长,但是数量众多。

于是博主先查看数据库的数据结构。

表1  gameinfo

表2 gamelabel

很明显,gameinfo表的label字段关联的是labelid的主键ID。单纯的一对一关系可以JOIN来写,

现在是这种不单纯的关系,那么就需要发挥大脑了。

后面博主经过一顿操作猛如虎,写出下面的最终优化语句。即减少了查询时间。也简化了SQL语句。

不废话,直接上代码

SELECT
	a.id AS gid,
	a.logo AS icon,
	a.gamename,
	a.duction,
	a.gamesize,
	from_unixtime(a.gametime, '%m-%d %H:00') AS gametime,
	a.downloadcount,
	TRIM(
		BOTH ','
		FROM
			LEFT (
				GROUP_CONCAT(b.labelname),
				10
			)
	) AS label
FROM
	`sy_gameinfo` `a`,
	`sy_gamelabel` `b`
WHERE
	(
		FIND_IN_SET(b.labelid, a.label)
	)
AND `state` = 1
GROUP BY
	`a`.`id`
ORDER BY
	`a`.`downloadcount` DESC
LIMIT 20

 

博主之所以加上GROUP_CONCAT函数是因为如果不分组的话,会查询许多相同的游戏名称的游戏,所以需要用group分组一下。

执行时间在几万数据的情况下载执行时间在0.23S左右。所以算是比较成功,后台可以根据where添加索引优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值