表信息
- 资源表 synsource 199824 rows
- 产品表 tab_product_detail 108 rows
- 资源与产品多对多的关联表 tab_r_sourmach 1,113,866 rows
以上表均采用MyISAM引擎.
连接测试
因 为方便用户进行更好的资源的搜索,所以需要将资源数据全部建立索引至Lucene中,希望在Lucene中存储的Document为:
sourceName | fileName | subject | grade | products |
英语学生用书第十一册 | 外研新标准.nwe | 英语 | 小学 | NP7000 NP6000 NP2300 |
英语学生用书第十二册 | 外研新标准2.nwe | 英语 | 小学 | NP2300 |
以上前四个字段是属于 synsource表中,而 products 属于 tab_product_detail 表,它们之间的关系由tab_r_sourmach进行中间关联。
一开始想到的是直接使用以下SQL:
select s1.sourid, s1.sourcename , t.product_name from synsource s1
left join tab_r_sourmach c
on s1.sourid=c.sourid
left join tab_product_detail t
on c.product_id = t.product_id where s1.sourceid=1
sourid | sourcename | subjectname | product_name |
1 | 小六上Module07 | 英语 | ND520 |
1 | 小六上Module07 | 英语 | NP560T |
1 | 小六上Module07 | 英语 | NP560+ |
1 | 小六上Module07 | 英语 | NP360+ |
5 rows in set (0.45 sec)
对于以上SQL的结果重复数据的合并处理考虑采用了
GROUP_CONCAT:
select s1.*, GROUP_CONCAT(t.product_name SEPARATOR ' ') as product_name
from tab_synsource s1
left join tab_r_sourmach c
on s1.sourid=c.sourid
left join tab_product_detail t
on c.product_id = t.product_id where s1.sourceid=1
sourid | sourcename | subjectname | product_name |
1 | 小六上Module07 | 英语 | ND520 NTV518 NP560T NP560+ NP360+ |
1 row in set (0.31 sec)
看上去似乎能够满足需求,但是以上只是针对单条数据进行查询,对于数据的批量索引建立的话肯定是直接 limit 500之类的操作。于是去掉以上where加上 limit 10执行之后,半天都执行不出来,估计它先会全部数据连接查询之后再去 limit。
于是先测试一下直接(tab_r_sourmach, tab_product_detail)两表关联看看效率如何:
select c.sourid
from tab_r_sourmach c left join tab_product_detail t
on c.product_id = t.product_id
group by c.sourid limit 500;
以上语句用时:(5.65 sec)
再加上GROUP_CONCAT试试:
select c.sourid, GROUP_CONCAT(t.product_name SEPARATOR ' ') as products
from tab_r_sourmach c left join tab_product_detail t
on c.product_id = t.product_id
group by c.sourid limit 800;
输出结果样例:
sourid | products |
767 | ND520 ND416 NTV518 NP560T NP560+ NP360+ |
760 | ND550 NP600+ NP9588 NP600 |
800 rows in set (1.74 sec) , 经过反复测试都发现加上了GROUP_CONCAT 函数比没使用该函数快了五倍多,暂时还不知道为什么。
不过1秒左右对于后台索引建立来说还算能够接受,于是再将以上SQL与 synsource 进行连接测试:
select * from synsource s, (
select c.sourid,
GROUP_CONCAT(t.product_name SEPARATOR ' ')
from tab_r_sourmach c left join tab_product_detail t
on
c.product_id = t.product_id
group by c.sourid limit 1000
) as b
where s.sourid = b.sourid;
输出结果样例:
968 | 词汇学习-第三级K(参考剑桥少儿英语) | 英语 | NP600+ NP600 |
983 | 词汇学习-六年级上Unit7(参考湘教版) | 英语 | ND520 ND416 NTV518 NP560T NP560+ NP360+ |
1000 rows in set (2.02 sec)
不知道大家对这种情况如何处理的?以上的SQL虽然能够达到目的,不过还是存在不足。
忘说了,在使用MYSQL GROUP_CONCAT函数进行分组连接时,它对字符串的长度连接是有长度限止的,默认的情况的话我发布 products 太长的话会被截断,如果想一劳永逸的话直接在my.cnf 中加入 group_concat_max_len=99999 即可。
分享到:
相关推荐
mysql中有种可以通过join相关操作进行表与表之间的方式查询不同结果集,但是在一对多的情况下,关键查询的结果是多条的.例如:班级和学习的关系,我想很直观的看到班级和学生的情况,列表显示出班级的信息和班级的男生...
mysql行转列(将同一列下的不同内容的几行数据,转换成几列显示)、列转行、行列汇总、合并显示
mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中,mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储到一行中 mysql_一列分多行操作,在一个表里的几行数据需要分拆成单行存储...
Mysql、oracle、Sybase数据库两列合并成一列的sql语句
MySql采用GROUP_CONCAT合并多条数据显示的方法mysql利用group_concat()合并多行数据到一行mysql如何实现多行查询结果合并成一行关于mysql合并表的详细介绍mysql中合并两个字段的方法分享mysql合并多条记录的单个字段...
单击此处添加标题 * * * * * * * * * * * * 目录页 MYSQL联合查询上 联合查询注入原理-SQL的union查询 SQL中UNION 操作符用于合并两个或多个 SELECT 语句的结果集。UNION 内部的 SELECT 语句必须拥有相同数量的列。...
用户可以根据自己对数据的需求,使用不同的查询方式。通过不同的查询方式,可以获得不同的数据。MySQL中是使用SELECT语句来查询数据的。在这一章中将讲解的内容包括。 1、查询语句的基本语法 2、在单表上查询数据 3...
2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....
2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL ...
2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....
6.3.1一个复杂查询还是多个简单查询201 6.3.2切分查询202 6.3.3分解关联查询203 6.4查询执行的基础204 6.4.1MySQL客户端/服务器通信协议205 6.4.2查询缓存208 6.4.3查询优化处理208 6.4.4查询执行引擎222 ...
2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL ...
2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL ...
2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....
MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 1.8.6. MySQL处理约束的方式 2. 安装MySQL 2.1. 一般安装问题 2.1.1. MySQL支持的操作系统 2.1.2. 选择要安装的MySQL分发版 2.1.3. 怎样...
2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL...
主要介绍了mysql实现合并同一ID对应多条数据的方法,涉及mysql GROUP_CONCAT函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X中安装MySQL 2.6. 在NetWare中安装MySQL 2.7....