如果我在laravel 4.2(数据库是mysql)中使用软删除,则每个雄辩的构建查询都有WHERE deleted_at IS NULL
。 deleted_at
上没有索引。
那么,Laravel的“soft_delete”是否需要索引MySQL?
答案 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处理软删除的默认特性,我的查询受到了影响。
我强烈建议为这些列建立索引,以使记录数升高时您的应用程序会窒息。
答案 2 :(得分:0)
简短的回答:也许吧。
长答案:
如果deleted_at
中的不同值很少,则MySQL将不会使用INDEX(deleted_at)
。
如果deleted_at
中没有不同的非空日期,MySQL将使用INDEX(deleted_at)
。
到目前为止,大多数讨论都没有考虑到该单列索引的基数。
注意:这与is_deleted
之类的2值标志不同。在这样的值上具有单列索引是没有用的。