将索引添加到gerrund表

Mat*_*nde 5 mysql sql 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
Run Code Online (Sandbox Code Playgroud)

我经常查询用户是否具有与此类似的访问权限:

SELECT * FROM `subscriptions` WHERE (group_id = 1 AND user_id = 2 AND pending = 0) LIMIT 1
Run Code Online (Sandbox Code Playgroud)

我想知道subscriptions(group_id, user_id, pending)在这种情况下添加一个独特的索引是否有帮助或阻碍?索引几乎整个表的最佳实践是什么?

Qua*_*noi 1

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

不过可能会有一点影响DML

创建索引实际上就是创建一个B-Tree具有以下结构的索引:

indexed_col1
indexed_col2
...
indexed_colN
row_pointer
Run Code Online (Sandbox Code Playgroud)

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

如果您不使用其他列而是在查询中建立索引,则可以单独从索引中检索所需的所有信息,甚至无需引用表本身。

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

请参阅我博客中的这篇文章作为示例: