2011-02-03 63 views
1

所以,我有这种有趣的需求,只在某一组行上的表上创建索引。只在mysql中的某些行上创建一个索引

这是我的表是什么样子:

USER:用户ID,friendid,创建,blah0,blah1,...,blahN现在

,我想创建一个指数:

(用户ID,friendid,创建)

但只在那些userid = friendid的行上。原因是此索引仅用于满足WHERE子句包含“userid = friendid”的查询。在这种情况下会出现很多行,我真的不想浪费索引上的所有额外空间。

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

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

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

我基本上是在寻找这样的事情:

ALTER TABLE用户添加INDEX(用户ID,friendid,创建)其中userid = friendid

+0

显然,我的要求并没有那么有趣。 db.cs.berkeley.edu/papers/ERL-M89-17.pdf – dhruvbird 2011-02-08 21:23:11

回答

3

关于条件指数:

你不能这样做。 MySQL没有这样的事情。

关于主键:

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

MyISAM不强制执行任何关于行的存储顺序;它们被追加到表的末尾,但删除的间隙可以重复使用,并且即使没有任何DELETE,查询也会使事情不按顺序。

InnoDB以其主键的顺序存储行。

+0

一个基于函数的索引可能,但MySQL肯定不支持它。 – 2011-02-03 07:16:16

+0

谢谢!你可能知道的任何黑客/近似? – dhruvbird 2011-02-03 07:16:24

0

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

表1:USER:用户标识符,已创建,blah0,blah1,...,

表2:userIsFriend(用户1,用户2,...)

,只是做你的分度表2(其中的元素可能对表1中的外键约束)

顺便说一句,你或许应该如果你想用mySQL做任何半认真的事情,恕我直言,你可以使用InnoDB。