所以,我有一个有趣的要求,即只在某组行上创建表的索引。
这就是我的表格:
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
答案 0 :(得分:3)
关于条件索引:
你不能这样做。 MySQL没有这样的东西。
关于主键:
这取决于存储引擎。 MySQL没有定义如何存储或检索数据,这是由存储引擎决定的。
MyISAM不会对如何存储行强制执行任何订单;它们会附加到表格末尾,但删除后的差距可以重复使用,即使没有任何UPDATE
,DELETE
查询也可能会使事情无序。
InnoDB按主键顺序存储行。
答案 1 :(得分:0)
很难说你在这里想要做什么(为什么用户需要成为他自己的朋友?)但在我看来,对数据库模式的简单反思可以解决这个问题。
表1:USER:userid,created,blah0,blah1,...,
表2:userIsFriend(user1,user2,...)
并且只对表2进行索引(其元素可能在表1中具有外键约束)
顺便说一下,如果你想用mySQL做任何半严重的事情,你应该使用InnoDB,恕我直言。