2009-08-26 66 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