所以,我有一个订阅表:
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)
上添加唯一索引是否有帮助或阻碍?索引几乎整个表格的最佳做法是什么?
答案 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
)可以利用数据唯一的事实并构建更有效的计划。
在我的博客中查看此文章的示例: