这里先说一下发生的背景,线下数据也就一百条不到的数据,用到了group_concat组合之后的模糊查询,这时数据效率感觉没啥,还好,但是到了线上,发现一条的查询效率是两秒多,非常慢,测试小姐姐提出了优化,算是一个小优化吧,纯粹的语句优化,没有加索引啥的

下面直接介绍云端的情况吧,数据库二十万数据不到

原始的sql

SELECT
	SELECT
		        p.id,
		        p.NAME,
		        p.nick_name AS nickName,
		        p.tel,
		        p.attentions,
		        p.identity,
		        p.stage,
		        p.option_time AS optionTime,
		        p.create_time AS createTime,
		        GROUP_CONCAT( b.`name` ) AS label         
		        patient_identity p        
		LEFT JOIN patient_data_label l ON p.id = l.patient_id        
		LEFT JOIN basicdata_label b ON b.id = l.label_id         
	GROUP BY
WHERE
	label LIKE '%aa%'

优化后的sql

SELECT
	p.id,
	p.NAME,
	p.nick_name AS nickName,
	p.tel,
	p.attentions,
	p.identity,
	p.stage,
	p.option_time AS optionTime,
	p.create_time AS createTime,
	GROUP_CONCAT( b.`name` ) AS label 
	patient_identity p
	LEFT JOIN patient_data_label l ON p.id = l.patient_id
	LEFT JOIN basicdata_label b ON b.id = l.label_id 
WHERE
	p.id IN ( SELECT l.patient_id FROM patient_data_label l LEFT JOIN basicdata_label b ON b.id = l.label_id WHERE b.`name` LIKE '%aa%' ) 
GROUP BY

看看,看看,吓一跳,这个效率简直了,所以,sql的优化真的很重要

不过这个说白了,也就是先筛选后分组,不能先分组再筛选,这样效率会很低

在工作中我们或多或少都会使用到函数group_concat,它可以合并多行的某列(或多列)数据为一行,默认以逗号分隔。最近碰到了一个线上bug,查询DB时返回的结果信息mysql自动截取了,导致页面显示的时候只显示了前半段结果。查询结果:我们可以看到MySql自动截取了我们返回结果的长度。为了方便测试,我们把本次回话的配置改为10个字节大小。group_concat_max_len参数。先说结论:MySql通过设置。函数结果字符串的最大长度。参数大小为1024个字节。 我有以下查询.这个想法是它允许我知道哪些组以及随后的用户可以访问每个component_instance.我想知道是否有更好的方法来做这个查询是相当缓慢的,但每次处理这个表时,这些额外的列是非常有用的:SELECT component_instances.*,GROUP_CONCAT(DISTINCT IF(permissions.view, groups.id, NULL)) AS view_g... 周师项目:视图查询 SELECT CONCAT("case ",GROUP_CONCAT(CONCAT("when JGDM = '",t.`DM`,"' then '",t.`MC`,"'") SEPARATOR ' ')," else '' end as JGDM ,") FRO 1.使用GROUP BY 分组 加HAVING条件 (因为where关键字无法与合计函数一起使用,例如sum(),avg()等,所以当有条件的话,需要放在having下) 下面展示一些 内联代码片。 // An highlighted block SELECT v.id, v.video_name, CONCAT(v.video_hour,':',v.video_minutes,':' ,v.video_seconds) videolength, v.video_hour, 数据库的设计是这样的:n 条不一样的数据,但是有一些数据的 CONFIRM_ORDER 字段是一样的,我现在想 ①把CONFIRM_ORDER 样的数据查询放到一个字段里面(这样子查询就可以根据 CONFIRM_ORDER 字段来分页了)。再者 ②有一个模糊查询,查询到某一调数据后,还要把跟这条数据有相同 CONFIRM_ORDER 的数据也查出来,比如我模糊查询到了第 1 条数据,由于第 1 条数据和第2 调数据的CONFIRM_ORDER 值一样,我也要把第 2 条 数据查询出来。 怕什么真理无穷,进一步有近一步的欢喜本文分享一篇在工作遇到的一个问题,关于MySQL GROUP_CONCAT函数导致的问题。希望能帮忙到你。开头聊几句一年又一年,2020这一年眼看就要...