mysql - Laravel 的 "soft_delete"需要 MySQL 上的索引吗?

标签 mysql laravel optimization indexing eloquent

如果我在 laravel 4.2 中使用软删除(数据库是 mysql),每个 eloquent 查询都有 WHERE deleted_at IS NULLdeleted_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/

相关文章:

php - 第 1 行 SQL 语法错误?

mysql - 使用 'IF' 检测 mysql 更新查询中的 NULL

mysql - mysql/mongodb集群适合安装在kubernetes上吗?

php - Laravel 多个可选参数不起作用

mysql - Laravel 在相关表中进行多重搜索

vba - 将工作表 1 第 1 列与工作表 2 第 1 列比较工作表 1 第 6 列中的位置值

MySQL子查询在大表中非常慢

mysql - 如何在按日期/unix 时间戳分组时优化查询?

C++优化函数调用批处理模式

database - Grammar.php 第 39 行中的 ErrorException : Array to string conversion