仅在mysql中的某些行上创建索引

时间:2011-02-03 07:10:06

标签: sql mysql indexing

所以,我有一个有趣的要求,即只在某组行上创建表的索引。

这就是我的表格:

  

USER:userid,friendid,created,blah0,blah1,...,blahN

现在,我想创建一个索引:

  

(userid,friendid,created)

但仅限于userid = friendid的那些行。原因是该索引仅用于满足WHERE子句包含“userid = friendid”的查询。会有很多行,但事实并非如此,我真的不想在索引上浪费所有额外的空间。

另一种选择是创建一个表(查询表),该表在此表的插入/更新时填充并创建一个触发器来执行此操作,但我再次猜测该表上的索引将意味着数据将是储存两次。

mysql如何存储主键?我的意思是在主键上排序的表,还是按插入顺序排序,PK就像一个普通的唯一索引?

我查看了聚簇索引(http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html),但似乎只有InnoDB支持它们。我正在使用MyISAM(我提到这个因为我可以在查询表中的这3个字段上创建聚簇索引)。

我基本上是在找这样的东西:

  

ALTER TABLE USERS ADD INDEX(userid,friendid,created)WHERE userid = friendid

2 个答案:

答案 0 :(得分:3)

关于条件索引:

你不能这样做。 MySQL没有这样的东西。

关于主键:

这取决于存储引擎。 MySQL没有定义如何存储或检索数据,这是由存储引擎决定的。

MyISAM不会对如何存储行强制执行任何订单;它们会附加到表格末尾,但删除后的差距可以重复使用,即使没有任何UPDATEDELETE查询也可能会使事情无序。

InnoDB按主键顺序存储行。

答案 1 :(得分:0)

很难说你在这里想要做什么(为什么用户需要成为他自己的朋友?)但在我看来,对数据库模式的简单反思可以解决这个问题。

表1:USER:userid,created,blah0,blah1,...,

表2:userIsFriend(user1,user2,...)

并且只对表2进行索引(其元素可能在表1中具有外键约束)

顺便说一下,如果你想用mySQL做任何半严重的事情,你应该使用InnoDB,恕我直言。