微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在soft_delete位置使查询速度降低5倍?

如何解决为什么在soft_delete位置使查询速度降低5倍?

我有一个使用Laravels Soft Deleteusers表,该表实际上是可空的deleted_at列。如果deleted_at为null,则表示该用户未被删除

我想计算在特定日期之后创建的130k用户表中未删除用户数量

使用

`select count(*) as aggregate from `users` where `created_at` >= '2019-09-18 10:33:09' and `users`.`deleted_at` is null`;

需要269毫秒。

使用

select count(*) as aggregate from `users` where date(`created_at`) >= '2019-09-18 10:33:09';

需要57毫秒。

该表包含137381个用户,其中48个用户被软删除

我在https://stackoverflow.com/a/26530488/2311074处发现deleted_at不应被索引,而实际上索引deleted_at并没有改变任何东西。 另外,创建索引索引(created_atdeleted_at)也不会更改任何内容

我能够提高查询的执行时间

select SUM(CASE WHEN  (deleted_at is null) THEN 1 ELSE 0 END) as aggregate from `users` where date(`created_at`) >= '2019-09-18 10:33:09';

仅在78毫秒内执行,但我不明白是什么原因加上额外的where条件使查询慢5倍?

使用MysqL Explain并没有帮助我找出问题所在。这是78ms查询的结果

enter image description here

这就是269ms查询的结果

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。