求教一个mysql建表分组索引问题

查看:152
本文介绍了求教一个mysql建表分组索引问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我在做一个网站程序,大致要求效果如下。
用户分为1-5这五个级别,数字越大权限越高。

我有一堆内容,级别越高的用户可见内容越多。
例如有内容:A、B、C、D、E,
用户组1的可见:A
用户组2的可见:A、B
…………
用户组5的可见:A、B、C、D、E
如果要实现这种功能,该如何建立数据库索引比较好呢?

之前有朋友跟我说在内容(topic)表加上一列"group",
写上可见的用户等级1-5,然后建立group_tid的联合索引。
然后查询tid<100周围文章(例如当前用户组为3)时的语句就是:
SELECT * FROM topic WHERE group>=3 AND tid<100 LIMIT 10;
可实际发现这种索引是先将group>3的所有数据读出来,再进行选择查询。
假如有100万条数据,有50万个group>3,该语句执行就要从50万条种筛选,效率极低。

看起来单列的索引只适用于group=*这样的限制条件,而不能是<或>。
所以想在此请教各路大神,有没有过类似的需求?如何正确建立索引或分表?
深表感谢!

补充1:
其实把问题改变一下,就是如何在mysql两个索引中使用<或>限定。
这是个逻辑问题,目前的group_tid索引建立后类似于下图:

即便我对group进行了范围限制,后面的tid还是在group的基础上按顺序排列的。
如果我想知道group>1且tid<6的这种情况,不得不先把group2/3全部读出再筛选。
看起来只有重新规划表结构,各位有没有类似经验?

补充2:
刚才收到了热心朋友的帮助回答,说这种情况他曾经遇到过。
解决的方法是修改发布机制,将符合条件的帖子发布至各个等级。
例如内容A的级别是3,那么发帖时要同时建立三个数据行:
group=1,tid=A
group=2,tid=A
group=3,tid=A
这样在内容读取时直接请求WHERE group=*都可以读出符合条件内容。
但这种方法需要添加大量的关联数据,甚至造成重复,有没有其他解决途径呢?

解决方案

其实你的思路已经很对了。

tid上建立索引,根据group分表。

如果group >=3的组,在程序中动态组合sql如下:

select * from group3 where tid < 100
union all 
select * from group4 where tid < 100
union all 
select * from group5 where tid < 100

以上索引生效,逻辑可用。

这篇关于求教一个mysql建表分组索引问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆