浏览 4090 次
锁定老帖子 主题:Mysql多对多查询、列合并
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-04-11
最后修改:2011-04-12
表信息
连接测试 因 为方便用户进行更好的资源的搜索,所以需要将资源数据全部建立索引至Lucene中,希望在Lucene中存储的Document为:
以上前四个字段是属于 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
对于以上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
看上去似乎能够满足需求,但是以上只是针对单条数据进行查询,对于数据的批量索引建立的话肯定是直接 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; 输出结果样例:
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; 输出结果样例:
1000 rows in set (2.02 sec) 不知道大家对这种情况如何处理的?以上的SQL虽然能够达到目的,不过还是存在不足。 忘说了,在使用MYSQL GROUP_CONCAT函数进行分组连接时,它对字符串的长度连接是有长度限止的,默认的情况的话我发布 products 太长的话会被截断,如果想一劳永逸的话直接在my.cnf 中加入 group_concat_max_len=99999 即可。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-04-15
问下,那数据说的是诺亚舟点读机?
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-04-15
java_user 写道 问下,那数据说的是诺亚舟点读机? |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||