mysql查询优化

标签 mysql optimization

SELECT
    b.categoryid,
    SUM(viewcount) AS cnt,
    categoryname
FROM
    bookvisit AS bv
    INNER JOIN book AS b ON b.isbn = bv.isbn
    LEFT JOIN category AS c ON b.categoryid = c.categoryid
WHERE
    b.categoryid IS NOT NULL AND
    b.categoryid <> 0 
GROUP BY
    b.categoryid 
ORDER BY
    cnt DESC,
    bv.isbn
LIMIT 0, 4

我有三个表 - 书籍(包含书籍信息) bookvisit(图书访问信息) 类别(类别主)

我需要的是流行类别,上面的查询可以用两个 eq_ref 但它有一个 使用临时的;也使用文件排序

有什么帮助吗?

最佳答案

根据您昨天的评论,我认为问题是您在计算(聚合)列上执行 ORDER BY,因此它不能使用索引。

解决此问题的唯一方法是添加一个 category.viewcount 列,您在更新 book.viewcount 时也会更新该列。它不会占用太多额外空间。此解决方案的缺点是:

  1. 当一本书的类别发生变化时(我认为这种情况很少见),您需要从旧类别中减去 book.viewcount 并将其添加到新类别中
  2. 类别表上的锁争用可能是一个性能问题

如果这是我并且性能很重要,我会编写一个单独的服务,在启动时将当前统计信息读入内存,并让系统向它发送更新并查询它以获取最新统计信息。这节省了锁定和编写类别表。

当然,如果数字不必是 100% 最新的,您始终可以通宵运行查询并缓存当天的结果。

关于mysql查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3670260/

相关文章:

javascript - 这个函数的性能可以变得更快吗?

javascript - 是否有可能比使用平方距离算法更快地测试两个圆的交点?

mysql - 在 1 亿+ 字符串中有效地搜索存在 5000 次

mysql - 错误 2002 (HY000) : Can't connect to local MySQL server through socket '/opt/lampp/var/mysql/mysql.sock' (111 "Connection refused")

java - `petid` 中的未知列 `field list`

mysql - 更有效的方法来计算mysql中的数据组?

c++ - 并行计算的 C++ 代码优化示例

algorithm - 具有 K 个额外节点的最小生成树

mysql - mysql 上的完全外连接?

php - 查询中的 mySQLi 语法错误