gpt4 book ai didi

mysql - 进行更高效的 COUNT

转载 作者:行者123 更新时间:2023-11-29 06:29:44 25 4
gpt4 key购买 nike

我有一个加载一些高级统计信息的页面。没什么特别的,只有大约 5 个指标。有两个特定的查询,每个查询大约需要 5 秒才能加载:

+ SELECT COUNT(*) FROM mybooks WHERE book_id IS NOT NULL
+ SELECT COUNT(*) FROM mybooks WHERE is_media = 1

该表大约有 500,000 行。两列均已编入索引。

这些信息一直在变化,所以我认为在这里缓存是行不通的。使用哪些技术可以加快速度?我在想:

  • 创建一个非规范化的 stats 表,每当列更新时该表都会更新。
  • 通过 ajax 加载缓慢的查询(这不会加快速度,但它允许页面立即加载)。

这里有什么建议?要求是页面在 1 秒内加载。

表结构:

  • id(pk,自动递增)
  • book_id (bigint)
  • is_media( bool 值)

最佳答案

统计表可能是最划算的/最快的。假设您可以完全控制您的 MySQL 服务器并且还没有适当的作业调度来处理这个问题,您可以使用 mysql 事件调度程序来解决这个问题。正如 Vlad 上面提到的,您的数据会有点过时。这是一个简单的例子:

示例统计表

CREATE TABLE stats(stat VARCHAR(20) PRIMARY KEY, count BIGINT);

初始化你的值

INSERT INTO stats(stat, count)
VALUES('all_books', 0), ('media_books', 0);

创建每 10 分钟更新一次的事件

DELIMITER |

CREATE EVENT IF NOT EXISTS updateBookCountsEvent
ON SCHEDULE EVERY 10 MINUTE STARTS NOW()
COMMENT 'Update book counts every 10 minutes'
DO
BEGIN
UPDATE stats
SET count = (SELECT COUNT(*) FROM mybooks)
WHERE stat = 'all_books';
UPDATE stats
SET count = (SELECT COUNT(*) FROM mybooks WHERE is_media = 1)
WHERE stat = 'media_books';
END |

检查是否执行

SELECT * FROM mysql.event;

没有?检查是否启用了事件调度程序

SELECT @@GLOBAL.event_scheduler;

如果它关闭,您需要在启动时使用参数 --event-scheduler=ON 或在您的 my.cnf 中设置它来启用它。看这个answerdocs .

关于mysql - 进行更高效的 COUNT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28652012/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com