求教一个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的这种情况,不得不先把group
2/3全部读出再筛选。
看起来只有重新规划表结构,各位有没有类似经验?
补充2:
刚才收到了热心朋友的帮助回答,说这种情况他曾经遇到过。
解决的方法是修改发布机制,将符合条件的帖子发布至各个等级。
例如内容A的级别是3,那么发帖时要同时建立三个数据行:group
=1,tid
=Agroup
=2,tid
=Agroup
=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屋!