2009-08-26 64 views
5

所以,我有一個訂閱表:添加索引gerrund表

id - int(11) (With Primary Key) 
user_id - int(11) 
group_id - int(11) 
role - int(11) 
pending - tinyint(1) 
created_at - datetime 
updated_at - datetime 

我經常做查詢,看是否用戶有類似這樣的訪問權限:

SELECT * FROM `subscriptions` WHERE (group_id = 1 AND user_id = 2 AND pending = 0) LIMIT 1 

我想知道在這種情況下在subscriptions(group_id, user_id, pending)上添加唯一索引是否有幫助或阻礙?索引幾乎整個表格的最佳做法是什麼?

回答

1

這肯定會有所幫助,特別是如果您在查詢中替換*1(如果您只是想檢查該行是否存在)。

雖然它可能對DML有一點影響。

創建索引實際上創建B-Tree具有這種結構:

indexed_col1 
indexed_col2 
... 
indexed_colN 
row_pointer 

作爲鍵,row_pointer被一個文件偏移(對於MyISAM)或的值的行的PRIMARY KEY(對於InnoDB

如果您沒有使用其他列而只是在您的查詢中編入索引,則可以單獨從ondex檢索所需的所有信息,甚至無需引用表本身。

如果您的數據本質上是唯一的,那麼在它們上創建UNIQUE索引總是好的。 MySQL的情況較少,但更高級的優化器(例如SQL Server)可以利用數據獨特的事實並構建更有效的計劃。

看到這篇文章在我的博客爲例:

+0

對不起,我的無知,DML? – 2009-08-26 15:00:45