如果我在 laravel 4.2 中使用软删除(数据库是 mysql),每个 eloquent 查询都有 WHERE deleted_at IS NULL
。 deleted_at
上没有索引。
- 在大 table 上会很慢吗? (或者也许
IS NULL
不需要索引就可以优化) - 我应该在
deleted_at
列上添加索引吗?
那么,Laravel 的“soft_delete”deleted_at
列在 MySQL 中是否需要索引?
澄清:Laravel 在 deleted_at
列中存储一个时间戳来表示记录何时被软删除,而不是 bool 值。
最佳答案
deleted_at
列不是一个好的索引候选。与评论相比,我将尝试更好地解释:索引仅在其基数相对较高时才有用。基数是描述数据集中索引唯一性的数字。这意味着它是记录总数除以唯一记录总数。
例如,主键的基数是1。每条记录都包含唯一的主键值。 1 也是最高的数字。您可以将其视为“100%”。
但是,deleted_at 之类的列没有这样的值。 Laravel 对 deleted_at 所做的是检查它是否为空。这意味着它有两个可能的值。包含两个值的列的基数极低,随着记录数的增加而降低。
您可以为这样的列建立索引,但它没有任何帮助。将会发生的事情是它可能会减慢速度并占用空间。
TL;DR:不,您不必为该列建立索引,索引不会对性能产生有益影响。
关于mysql - Laravel 的 "soft_delete"需要 MySQL 上的索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525068/