2011-02-03 66 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。