问一个关于MySQL索引的问题

2013-08-15 15:52:50 +08:00
 kenneth
tag有3个字符串。假设"科技","生活",”互联网“
字符串建索引效率不高
科技=》1
生活=》2
互联网=》3

对应文章表中 tag=1,2,3

这样写查询语句?

大家来帮我分析下,索引是否正确和查询效率,以及要考虑的问题。

设计的不足之处,希望高手指正。
2886 次点击
所在节点    程序员
11 条回复
jamiesun
2013-08-15 16:00:09 +08:00
那你试试用set字段呗
barbery
2013-08-15 16:02:48 +08:00
楼主想表达什么? 用tag id查文章? 是的话用IN就好, tag_id IN(1,2,3)
kenneth
2013-08-15 16:05:00 +08:00
@barbery
post表 tag=1,2,3
查询的时候用IN的话效率好不好,有没有用到索引,我的意思是。
我是担心索引效率
MarsWang
2013-08-15 16:07:25 +08:00
explain 下看看有没用到索引
noahzh
2013-08-15 16:14:48 +08:00
你这样是sql 中的反模式,叫乱穿马路.这样根本没有意义,使用一对多的关系..就可以解决.用关系表来连接
kenneth
2013-08-15 16:17:41 +08:00
@noahzh 感觉你说的对,能否分析一下呢。我知道错,但是不知道原因,理解不到错的哪里。
ipconfiger
2013-08-15 16:19:07 +08:00
IN 查询 不走索引的,绕道吧。
@kenneth
revlis7
2013-08-15 16:22:54 +08:00
我们用奇葩的二进制来做这种分类(好像set的内部实现就是这样的)

比如:
"科技":0001(十进制1)
"生活":0010(十进制2)
"网络":0100(十进制4)

比如用户偏好是0011(十进制3),那么就代表只查看科技与生活类的信息,查询时用按位与操作进行过滤。

效率高不高不知道,这么做的好处是可以预留几位为今后扩展作考虑,否则用set做字段类型的话,扩展set字段时,需要更新表结构重建整张表。
ayang23
2013-08-15 17:27:16 +08:00
这个字段只有3个取值,索引唯一性不高,mysql不会使用索引的,除非你强制索引。
msg7086
2013-08-15 18:13:23 +08:00
反设计模式。

一般推荐用一个关系表来表达。people_tag_relationship表。
noahzh
2013-08-15 19:15:26 +08:00
@kenneth
创建tag 表 contact 表 post表
id name post_id tag_id id content
1 科技 1 2 1 xxxx
2 生活 1 3 2 yyyyy
3 互联网 2 2
contact 中 post_id,tage_id 分别是外键,你的问题最正确的解法.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/79193

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX