【问题标题】:Where is equal to zero is so slow哪里等于零这么慢
【发布时间】:2019-02-09 07:07:19
【问题描述】:

我将 Laravel 5.6 和 MySQL 用于 DB

public function getTopPaid(){
    $books = Book::with('users')->where('price', '>', 0 )->get()
        ->sortByDesc(function ($book){
            return $book->users->count();//sorting by purchased users count
        })->take(25);
    return new BooksWithAuthors($books);
}

我想使用上面的代码获得购买次数最多的付费书籍。这很好,响应时间为 1700 毫秒。以及大约 400 条记录。

但是下面的代码几乎是一样的:

public function getTopFree(){
    $books = Book::with('users')->where('price', '=', 0 )->get()
        ->sortByDesc(function ($book){
            return $book->users->count();
        })->take(25);
    return new BooksWithAuthors($books);
}

结果中只有 34 条记录,但响应时间为 8000 毫秒。代码的唯一区别是 “相等”

where('price', '>', 0 ) 

where('price', '=', 0 )

为什么第二个查询这么慢?以及如何解决这个问题

【问题讨论】:

  • 两者都是两个不同的查询,具有两组不同的输出。
  • 你说第一个需要1700毫秒,第二个需要8毫秒。然后问为什么第二个这么慢。你是这个意思吗?
  • 是的,克里斯·李尔
  • 不是您想要的答案,但如果您真的关心性能,您应该避免从数据库中获取所有记录 (->get()),然后在 PHP (->sortByDesc()) 中进行聚合。相反,您应该使用适当的groupBy 查询来利用对数据库的聚合。否则,当您有数千条记录时,您的解决方案将无法很好地扩展(因为您将始终获取所有记录但只保留 25 条)
  • @AkbarTukhtamurodov 你确定吗?你想知道为什么 second 这么慢吗? 8 比 1700 少很多。第二个查询可能更快,因为它适用于更少的记录(由于更精确的=),可能涉及索引,可能有可能。我们没有足够的信息来确定。

标签: php mysql laravel laravel-5.6 mysql-8.0


【解决方案1】:

如果您经常使用价格列进行搜索 您可以考虑为该列添加索引以提高性能:

CREATE INDEX books_price_idx ON books (price)

【讨论】:

    【解决方案2】:

    默认情况下,MySQL 将其索引存储在 BTREE 中。一般没有散列。

    性能差异的简短答案是 > 形式比 = 形式评估更多节点。

    【讨论】:

    • 我写错了,不是8毫秒,而是8000毫秒,即8秒。
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2015-05-14
    • 2010-09-25
    • 2011-01-23
    相关资源
    最近更新 更多