【问题标题】:Optimising MySQL Database Indexes InnoDB优化 MySQL 数据库索引 InnoDB
【发布时间】:2014-01-12 16:28:10
【问题描述】:

我已经在 Google 上搜索了几个小时,但我还没有完全弄清楚索引是如何工作的,因为有很多混合的答案可用。

假设我有一个查询 1:

SELECT subid, subid2 FROM clicks WHERE wid=100 AND uid=123 AND time >= 1387886885

还有一个查询 2:

SELECT subid, subid2 FROM clicks WHERE fid=100 AND time >= 1387886885 AND uid=123

1) 我应该如何在这里放置索引?我应该使用多列索引还是单列索引?

2) 我在 stackoverflow 上找到了一个答案,该答案建议也向 subid 和 subid2 添加索引,我应该这样做吗?如果不是,在什么情况下会这样做?

【问题讨论】:

  • 如果您有很多(数十亿)次点击,并且您比较频繁地运行此查询,您可以考虑根据时间列进行分区。
  • 谢谢,我会调查的。

标签: mysql optimization indexing innodb


【解决方案1】:

Here is a link of trying to simplify indexes. 从初学者的角度来看,原始帖子的简单示例并解释索引如何与他们正在寻找的内容相关联可能会有所帮助。

因此,在您的场景中,我将有一个基于

的索引

(wid, uid, 时间)

(不确定 wid 与 fid 是否只是类型-o)

索引应该以您最常见的查询组件可能要求的内容为基础......通常是一些 ID 或用户基础,可能是日期范围。但是根据链接示例,使用最精确到索引字段列表前面的字段来获取您的条件。

【讨论】:

    【解决方案2】:

    我应该如何在这里放置索引?我应该使用多列索引还是 单列索引?

    您应该创建复合索引(读取为多列索引),因为它们具有更好的索引选择性

    我在 stackoverflow 上找到了一个建议添加索引的答案 subid 和 subid2 也是,我应该这样做吗?如果不是,在什么情况下 在这种情况下会这样做吗?

    我认为您的意思是覆盖索引。覆盖索引选择数据的速度非常快,因为可以从索引数据中读取所有数据,而无需访问表数据。

    查询 1

    SELECT subid, subid2 FROM clicks WHERE wid=100 AND uid=123 AND time >= 1387886885
    

    需要这个索引

    INDEX(wid, uid, time) 
    

    或者这个覆盖索引

    INDEX(wid, uid, time, subid, subid2) 
    

    查询 2

    SELECT subid, subid2 FROM clicks WHERE fid=100 AND time >= 1387886885 AND uid=123
    

    需要这个索引

    INDEX(fid, uid, time) 
    

    或者这个覆盖索引

    INDEX(fid, uid, time, subid, subid2) 
    

    【讨论】:

    • 也许我应该使用诸如 (uid,time,subid,subid2) 之类的覆盖索引来避免创建几乎相同的索引?实际上有 fid、wid 和 yid,所以我需要 3 个几乎相同的索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2011-09-03
    • 2016-05-18
    • 1970-01-01
    相关资源
    最近更新 更多