将索引添加到gerrund表

时间:2009-08-26 14:54:22

标签: sql mysql indexing

所以,我有一个订阅表:

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 个答案:

答案 0 :(得分:1)

这肯定会有所帮助,特别是如果您在查询中将*替换为1(如果您只想检查该行是否存在)。

虽然可能对DML产生一点影响。

创建索引实际上是在创建具有以下结构的B-Tree

indexed_col1
indexed_col2
...
indexed_colN
row_pointer

作为键,row_pointer是文件偏移量(MyISAM)或行PRIMARY KEY的值(InnoDB

如果您不使用其他列但在查询中编入索引,则只需从ondex中检索所需的所有信息,甚至无需参考表本身。

如果您的数据本质上是唯一的,那么在它们上创建UNIQUE索引总是好的。 MySQL的情况较少,但更高级的优化器(例如SQL Server)可以利用数据唯一的事实并构建更有效的计划。

在我的博客中查看此文章的示例: