Mysql查询优化——中间表方法优化count()统计大数据量总数问题

来源:互联网 发布:手机淘宝怎么改评论 编辑:程序博客网 时间:2024/03/29 03:55

在上一篇博文我们提到,分页有三种方法。其中,第三种是我们最常用的。然而,在实际应用过程中我们会发现,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;

 

1 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鼻子做的不好看怎么办 埋线双眼皮出血怎么办 割完双眼皮出血怎么办 全切双眼皮出血怎么办 割双眼皮出血了怎么办 割双眼皮后出血怎么办 双眼皮手术后出血怎么办 缝双眼皮开了怎么办 朋友网没了怎么办 压疮发生后怎么办 学籍账号已登录怎么办 护士学分不达标怎么办 高中学籍错了怎么办 定时器时间太短不够用怎么办? 考试时间不够用怎么办 感觉时间不够用怎么办 学习时间不够用怎么办 天天时间不够用怎么办 网贷骚扰通讯录怎么办 老被电话骚扰怎么办 对付广场舞噪音怎么办 普法平台考试不及格怎么办 假疫苗事件孩子怎么办 网上办生育证怎么办? 新生儿足跟血筛查没通过怎么办 新生儿听力筛查未通过怎么办 医药代表业绩差怎么办 网站诈骗被骗了怎么办 网贷利息过高怎么办 麦粒肿脓包不破怎么办 处方单丢了怎么办 深圳社保转外省怎么办 单位退休后医保怎么办 鼓楼医院就诊卡怎么办 2017个体户怎么办环评 查环保停工工人怎么办 林地己建房了怎么办 交不起环保罚款怎么办 单位没钱交社保怎么办 单位不缴医保怎么办 公司拖欠工资后注销怎么办