新足迹

 找回密码
 注册

精华好帖回顾

· 我在疫情期间去了一趟哈哈密密尔顿❀❀顺便打卡了一下传说中的Qualia (2020-7-25) 小兔白又白 · 我的垃圾证书经历 (2008-10-1) Monica
· 清凉和孩子们的亲子共读故事(181楼更新:我家孩子喜欢的图画书书单) (2009-5-22) 清凉 · 穿越今天下午正式发车 (2008-4-15) DAVIDYW
Advertisement
Advertisement
12
返回列表 发新帖
楼主:cloud226

问一个数据库循环读取信息的问题 [复制链接]

发表于 2013-6-5 15:47 |显示全部楼层
此文章由 cloud226 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cloud226 所有!转贴必须注明作者、出处和本声明,并保持内容完整
鱼羊鲜 发表于 2013-6-5 14:11
这样存储很不合理。3楼已经说了,一个like就解决了,性能不会很差。

恩 我知道这是一个解决方案

但最希望能直接对我的query做index或优化 因为表里已经有很多很多数据 而其中绝大部分在这次改动并不需要

Advertisement
Advertisement

发表于 2013-6-5 15:54 |显示全部楼层
此文章由 cloud226 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cloud226 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 cloud226 于 2013-6-5 17:16 编辑
stevenbian 发表于 2013-6-5 14:27
这和DBA没关系吧。
搞数据库开发的都懂呀。
专业论坛发言还要解释那么具体啊 :-)


哈哈 主要是我对一些中文名词不太理解 从你的解释看“字段”就是表的column吧

这样的话 增加level (depth)这个column对我的需求具体有什么意义? 如果我要找A下面的所有回复 还是要循环的一层一层的找啊 而因为已经有了parent_id 所以增加这个level (depth) 好像也不会增快查询速度吧

关于表自连 因为mysql不支持connect by 只是用普通的join吗? 具体应该如何处理?

感谢:)

发表于 2013-6-5 16:00 |显示全部楼层
此文章由 cloud226 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cloud226 所有!转贴必须注明作者、出处和本声明,并保持内容完整
这个是现状

Mysql is the only system of the big four that does not support recursion natively. It has neither recursive CTE‘s nor CONNECT BY clause, not even rowset returning functions that help to emulate recursion in PostgreSQL 8.3

发表于 2013-6-5 16:14 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
现在有空,让我们来好好考虑一下这个问题
1. 你的数据库不支持recursive query
2. 你对performance有要求
3. 你有没有权利添加index或者增加table?
4. 你有权利添加user defined function

先问清楚
1. 你这是在做论坛数据库吗?好像帖子里,“只看该作者”,你的要求是“只看相关帖”?
2. 如果是上面的情况,你的“只看相关帖”,是在进入主贴之后吗?

如果上面两个的回答是肯定的
我建议你应该在business layer寻找解决办法,而不是data layer,在你拿到当前帖子的dataset之后做再做select and sorting

如果那两个问题是否定的答案。建议你自己或者dba做一下tuning,例如加index,这或许能解决performance的问题,或许不能
无论能不能,建议你不要用function在平常的数据读取
或者你可以用一次function建立起新的关系table,用trigger保持更新,你平时的关系查询到新的关系表

评分

参与人数 1积分 +2 收起 理由
cloud226 + 2 thanks~~ and lol to your signature

查看全部评分

If you let people believe that you are weak, sooner or later you’re going to have to kill them.

发表于 2013-6-5 16:55 |显示全部楼层
此文章由 cloud226 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cloud226 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 cloud226 于 2013-6-5 16:56 编辑
北风 发表于 2013-6-5 16:14
现在有空,让我们来好好考虑一下这个问题
1. 你的数据库不支持recursive query
2. 你对performance有要求


呵呵 谢谢北风兄

抱歉之前没有把所有信息描述清楚

现在的情况 我是在一个现有的网站上改动 这个网站的一部分是论坛形式 所有的thread在现阶段就是和足迹网的帖子一样 一个message一个message按照回复时间排列的

现在想要改成和stackoverflow类似的问答形式 那排列方式就是问题+各个答案 但是在各个答案中 我想要兼顾之前的数据 而之前的message很多情况下是一个回复另一个 比如A1,A2是答案 B回复了A1来讨论 C和D等又回复了B 等等 这样在A1下面就需要列出B,C,D...

我有权添加任何东西 所以鱼羊鲜和workinvm提出的建议可以采用 但是之前的数据库就比较大了 所以我倾向于做index 而不是改动数据库

发表于 2013-6-5 16:58 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
cloud226 发表于 2013-6-5 15:54
哈哈 主要是我对一些中文名词不太理解 从你的解释看“字段”就是表的column吧

这样的话 增加level (dept ...

增加了一个level字段对自下而上的查询效果应该很明显,用普通的jion就可以了。

不过你的需求是自上而下的遍历树,就要用到外连接(out join)了.不过mysql 的inner join貌似很不给力。
也许你可以自己研究下怎么组装sql

评分

参与人数 1积分 +2 收起 理由
cloud226 + 2 感谢分享

查看全部评分

签名不可外链
Advertisement
Advertisement

发表于 2013-6-6 13:36 |显示全部楼层
此文章由 cloud226 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cloud226 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 cloud226 于 2013-6-6 13:38 编辑

从大家提供的和我查询的资料来看

nested set能极大的提高查询速度

但具体如何实施 我很有疑问

像给record加上左右点(left point, right point) 然后point范围内的就是它的所有回复 这确实很有效率 但如果有新回复 那如何处理所有record的point?

发表于 2013-6-7 17:14 |显示全部楼层
此文章由 stevenbian 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 stevenbian 所有!转贴必须注明作者、出处和本声明,并保持内容完整
cloud226 发表于 2013-6-6 13:36
从大家提供的和我查询的资料来看

nested set能极大的提高查询速度

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';

left join挺好,从A1的depth循环到max depth,再把最后的空列去掉就行了。
加depth比你update point简单多了。
签名不可外链

发表于 2013-6-7 17:19 |显示全部楼层
此文章由 cloud226 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 cloud226 所有!转贴必须注明作者、出处和本声明,并保持内容完整
stevenbian 发表于 2013-6-7 17:14
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT ...

因为历史原因

这里没有max_depth 所以比较难手动控制 必须一直循环直到返回的结果为零

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部