优化MySQL数据库索引InnoDB

时间:2013-12-24 12:10:44

标签: mysql optimization indexing innodb

我已经谷歌了几个小时了,我还没有弄清楚索引是如何工作的,因为有很多可用的混合答案。

假设我有一个查询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中添加索引,我应该这样做吗?如果没有,在什么情况下会这样做?

2 个答案:

答案 0 :(得分:0)

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

所以,在你的场景中,我会有一个基于

的索引

(wid,uid,time)

(不确定wid vs fid是否只是一种类型-o)

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

答案 1 :(得分:0)

  

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

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

  

我在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)