Mysql使用高流量数据库上的过滤器计算行数

Poe*_*rin 9 php mysql algorithm count

假设您有一个搜索表单,有多个选择字段,假设用户从下拉列表中选择一个选项,但在提交数据之前,我需要显示数据库中行的计数.

所以假设该网站每天至少有300k(300.000)个访问者,并且用户从访问表中选择的选项至少40次,这意味着12M ajax请求+ 12M计数查询数据库,这似乎有点太多了

问题是如何实现快速计数(使用php(Zend Framework)和MySQL),以便数据库上的额外12M查询不会影响站点的负载.

一种解决方案是具有存储所选字段的所有组合及其各自计数的表(当从产品表中添加或删除产品时,将更新存储计数的表).虽然对于43个中的8个过滤器(选择选项)而言,这不是一个好主意,但是需要管理+ 8M行.

关于如何实现这一点的任何其他想法?

ps我不需要代码示例,但想法本身可以在这种情况下工作.

Wes*_*orp 7

我可能会有一个预先计算好的表 - 正如你自己建议的那样.导入是你有两个智能机制:

  1. 轻松查询哪些条目受哪个更改影响.
  2. 为整个表单请求提供唯一的查找字段.

如果你有实心键,8M条目不会很重要,因为你只需要直接查找.

我会麻烦地在所有需要的地方为这个表写特定的更新.即使有大量的变化,这仍然是有效的.如果操作正确,您将知道在插入/更新/删除产品时需要更新或无效的行.

旁注:根据您的评论.如果你需要在八个地方添加代码来覆盖所有可以删除的地方 - 这可能是重构和集中某些代码的好时机.


Joh*_*ica 2

我建议使用一个单独的表来缓存计数,并结合触发器。

为了使其速度更快,您将其设为内存表,并使用插入、删除和更新的触发器来更新它。

伪代码:

CREATE TABLE counts (
  id unsigned integer auto_increment primary key
  option integer indexed using hash key
  user_id integer indexed using hash key
  rowcount unsigned integer
  unique key user_option (user, option)
) engine = memory

DELIMITER $$

CREATE TRIGGER ai_tablex_each AFTER UPDATE ON tablex FOR EACH ROW
BEGIN
  IF (old.option <> new.option) OR (old.user_id <> new.user_id) THEN BEGIN
    UPDATE counts c SET c.rowcount = c.rowcount - 1 
      WHERE c.user_id = old.user_id and c.option = old.option; 
    INSERT INTO counts rowcount, user_id, option  
      VALUES (1, new.user_id, new.option)
      ON DUPLICATE KEY SET c.rowcount = c.rowcount + 1; 
  END; END IF;
END $$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

计数的选择将是即时的,并且触发器中的更新也不应该花费很长时间,因为您使用的是具有哈希索引的内存表,其查找时间为 O(1)。

链接:
内存引擎:http://dev.mysql.com/doc/refman/5.5/en/memory-storage-engine.html
触发器: http: //dev.mysql.com/doc/refman/5.5/en/触发器.html