zoukankan      html  css  js  c++  java
  • Mysql查询优化之 触发器加中间表 方法优化count()统计大数据量总数问题

        转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6138288.html

        在上一篇博文我们提到,分页有三种方法。其中,第三种是我们最常用的。然而,在实际应用过程中我们会发现,select count(*) from tname 语句在统计某表内记录总数时,如果表内数据量达到一定规模(比如100W条),这个语句就会执行得非常慢。有什么办法可以加快统计出表内记录总数呢?

        这里,我们需要借助一个中间表来记录数据库内各表记录总数。然后,在我们需要知道某表的记录总数来计算分页数时直接查询中间表获取目的表的记录总数即可。无需把目的表全部查询一次然后逐一统计。

       

        这里有人要问了,这个中间表哪儿来的呢?嘿嘿,无需再用一个文件来定期更新!数据库已经为我们提供了一个很好的工具啦!那就是——触发器。

        触发器是一种特殊的存储过程。一般的存储过程是通过存储过程名直接调用,而触发器主要是通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制执行。所以,我们只需要为每个需要监听的表创建一个触发器,使得该表有增、删操作时,自动对rowsCount中间表里相应的记录进行修改,即可同步更新中间表对各表的记录。

        这里大致讲一下触发器的创建:我用的数据库桌面工具是SQLyog。

        在需要监听的表上右键,选择“创建触发器”,工具会自动生成一些通用的代码如下:

        CREATE
        TRIGGER `数据库名`.`触发器名` BEFORE/AFTER INSERT/UPDATE/DELETE
        ON `数据库名`.`<Table Name>`
        FOR EACH ROW

        BEGIN

        事件发生后执行的代码
        END

    监听器有两种:事前执行与事后执行。分别对应上面的BEFORE/AFTER.

    事件类型有三种:插入、修改、删除

    监听对象为:数据库名.表名

    事件发生后代码:触发器的主体部分。用于响应监听对象发生所监听的事件前/后所执行的sql操作。比如:修改某中间表中的数据来记录监听表的变化。

        实例:为admin表创建监听器,在admin表有数据插入后,激活触发器执行,更新pagecount中间表中,tablename为admin的那条记录的total属性,因为插入了一条记录,所以total+1.

       

        CREATE
        TRIGGER `counter` AFTER INSERT ON `admin` 
        FOR EACH ROW    
        BEGIN
        UPDATE pagecount SET total=total+1 WHERE tablename = 'admin';
        END;

      

  • 相关阅读:
    Linux关闭防火墙命令
    js改变数组的两个元素的位子,互换、置顶
    vue nexttick的理解和使用场景
    vue mint-ui 框架下拉刷新上拉加载组件的使用
    vue项目中使用了vw适配方案,引入第三方ui框架mint-ui时,适配问题解决
    小程序开发笔记【二】,抽奖结果json数据拼装bug解决
    gulp插件gulp-nunjucks-render的使用及gulp4的简单了解
    小程序开发笔记【一】,查询用户参与活动列表 left join on的用法
    mysql数据插入前判断是否存在
    微信公众号通过图片选取接口上传到阿里oss
  • 原文地址:https://www.cnblogs.com/ygj0930/p/6138288.html
Copyright © 2011-2022 走看看