加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 使用高流量数据库中的过滤器的Mysql计数行

发布时间:2020-12-13 13:13:18 所属栏目:PHP教程 来源:网络整理
导读:假设您有一个搜索表单,有多个选择字段,假设用户从下拉列表中选择一个选项,但在提交数据之前,我需要显示数据库中的行数. 那么让我们说这个网站每天至少有三千万(300,000)个访问者,用户从访问中至少选择40次访问选项,这意味着12M的ajax请求数据库上的12M计数查
假设您有一个搜索表单,有多个选择字段,假设用户从下拉列表中选择一个选项,但在提交数据之前,我需要显示数据库中的行数.

那么让我们说这个网站每天至少有三千万(300,000)个访问者,用户从访问中至少选择40次访问选项,这意味着12M的ajax请求数据库上的12M计数查询,这似乎有点太多了.

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

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

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

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

附:明天我会用一个赏金来更新这个问题.

我会建议一个单独的表缓存计数,结合触发器.

为了使其快速,您将其设置为内存表,并使用插入,删除和更新的触发器进行更新.

伪码:

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 ;

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读