Laravel" soft_delete"需要MySQL的索引?

时间:2014-10-23 09:27:24

标签: mysql optimization laravel eloquent

如果我在laravel 4.2(数据库是mysql)中使用软删除,则每个雄辩的构建查询都有WHERE deleted_at IS NULLdeleted_at上没有索引。

  • 大桌子会慢吗? (或者IS NULL可以在没有索引的情况下进行优化)
  • 我应该在soft_delete上添加索引吗?

那么,Laravel的“soft_delete”是否需要索引MySQL?

3 个答案:

答案 0 :(得分:48)

deleted_at不是一个好的索引候选者。与评论相比,我会尝试更好地解释:索引仅在其基数相对较高时才有用。基数是描述数据集中索引唯一性的数字。这意味着它的总记录数除以总的唯一记录。

例如,主键的基数为1.每个记录包含主键的唯一值。 1也是最高的数字。您可以将其视为“100%”。

但是,像deleted_at这样的列没有这样的值。 Laravel对deleted_at的作用是检查它是否为空。这意味着它有两个可能的值。包含两个值的列具有极低的基数,随着记录数量的增加而减少。

您可以索引此类列,但它不会有任何帮助。会发生什么事情会减慢速度并占用空间。

TL; DR:不,您不必索引该列,索引对性能没有任何有益影响。

答案 1 :(得分:1)

我不知道为什么@ N.B。有很多投票,在我看来,这完全不正确。

我将索引添加到某些键表上的delete_at时间戳,并享受一些查询从32s减少到5.4ms以下的查询。这实际上取决于您的应用程序的性质。

在我的场景中,我有3个带有软删除的表,一些简单的联接(全部带有索引),但是由于Laravel处理软删除的默认特性,我的查询受到了影响。

我强烈建议为这些列建立索引,以使记录数升高时您的应用程序会窒息。

Before migration. 32s query time. index1 index2 index3 After migration. 5.4ms

答案 2 :(得分:0)

简短的回答:也许吧。

长答案:

如果deleted_at中的不同值很少,则MySQL将不会使用INDEX(deleted_at)

如果deleted_at中没有不同的非空日期,MySQL将使用INDEX(deleted_at)

到目前为止,大多数讨论都没有考虑到该单列索引的基数。

注意:这与is_deleted之类的2值标志不同。在这样的值上具有单列索引是没有用的。