V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kenneth
V2EX  ›  程序员

问一个关于MySQL索引的问题

  •  
  •   kenneth · 2013-08-15 15:52:50 +08:00 · 2762 次点击
    这是一个创建于 3930 天前的主题,其中的信息可能已经有所发展或是发生改变。
    tag有3个字符串。假设"科技","生活",”互联网“
    字符串建索引效率不高
    科技=》1
    生活=》2
    互联网=》3

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

    这样写查询语句?

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

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

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

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

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

    一般推荐用一个关系表来表达。people_tag_relationship表。
    noahzh
        11
    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 分别是外键,你的问题最正确的解法.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 06:58 · PVG 14:58 · LAX 23:58 · JFK 02:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.