玩家必看科普!麻豆人人妻人人妻人人片AV,欧美老妇交乱视频在线观看,久久综合九色综合久99_知乎
<ruby id="fgcka"></ruby>
  • <progress id="fgcka"></progress>
    <tbody id="fgcka"></tbody>
    <dd id="fgcka"></dd>

    1. <dd id="fgcka"></dd>

      <em id="fgcka"></em>
        1. 系統城裝機大師 - 固鎮縣祥瑞電腦科技銷售部宣傳站!

          當前位置:首頁 > 數據庫 > Mysql > 詳細頁面

          利用Mysql定時+存儲過程創建臨時表統計數據的過程

          時間:2023-03-19來源:系統城裝機大師作者:佚名

          1.mysql定時任務簡單介紹

          mysql的定時任務是使用event(事件)來實現的,自mysql5.1.6版本起,增加了這個功能 - 事件調度器(event scheduler),它可以精確到每秒鐘執行一個任務,在一些對數據實時性要求比較高的場景非常使用,接下來我將用mysql的event事件來實現定時統計數據。

          2.準備工作

          (1)查看定時策略是否開啟

          1 show variables like '%event_sche%';

          執行結果如下

          ON表示處于開啟狀態,如果是OFF則表示處于關閉狀態,假設處于關閉狀態,使用下面sql語句開啟和關閉就行。

          1
          2
          3
          4
          5
          6
          7
          --開啟定時調度策略(下面兩個語句都可以)
          set global event_scheduler=1;
          set global event_scheduler = on;
            
          --關閉定時調度策略(下面兩個語句都可以)
          set global event_scheduler=0;
          set global event_scheduler = off;

          關閉定時調度策略sql執行結果:

          開啟定時調度策略sql執行結果:

          (2)執行用戶信息表和用戶訂單表sql腳本

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          # 用戶信息表
          CREATE TABLE `user_info` (
              `id` INT ( 11 ) NOT NULL AUTO_INCREMENT COMMENT 'ID',
              `name` VARCHAR ( 30 ) NOT NULL COMMENT '用戶名',
              `phone` VARCHAR ( 11 ) NOT NULL COMMENT '手機號',
              `status` TINYINT ( 1 ) NULL DEFAULT NULL COMMENT '用戶狀態:停用0,啟動1',
              `create_time` datetime NOT NULL COMMENT '創建時間',
              PRIMARY KEY ( `id` ) USING BTREE
          ) ENGINE = INNODB AUTO_INCREMENT = 10001 CHARACTER
          SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶信息表';
            
          # 用戶訂單表
          CREATE TABLE `user_order`  (
            `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
            `order_num` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '訂單編號',
            `user_id` int(11) NOT NULL COMMENT '用戶ID',
            `create_time` datetime NOT NULL COMMENT '創建時間',
            PRIMARY KEY (`id`) USING BTREE,
            UNIQUE INDEX `idx_order_num`(`order_num`) USING BTREE COMMENT '訂單編號唯一'
          ) ENGINE = INNODB AUTO_INCREMENT = 10001 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶訂單表';

          (3)執行插入測試數據sql腳本

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          # 向用戶信息表中插入三條測試數據
          INSERT INTO `user_info` (`id`, `name`, `phone`, `status`, `create_time`) VALUES (10001, '張三', '13900669010', 1, '2023-03-14 17:01:42');
          INSERT INTO  `user_info` (`id`, `name`, `phone`, `status`, `create_time`) VALUES (10002, '李四', '13900669111', 1, '2023-03-14 17:01:42');
          INSERT INTO  `user_info` (`id`, `name`, `phone`, `status`, `create_time`) VALUES (10003, '王五', '13900669876', 1, '2023-03-14 17:01:42');
            
          # 向用戶訂單表中插入八條測試數據
          INSERT INTO  `user_order` (`id`, `order_num`, `user_id`, `create_time`) VALUES (10001, 'dingdan001', 10002, '2023-03-14 17:03:40');
          INSERT INTO  `user_order` (`id`, `order_num`, `user_id`, `create_time`) VALUES (10002, 'dingdan002', 10003, '2023-03-14 17:03:40');
          INSERT INTO  `user_order` (`id`, `order_num`, `user_id`, `create_time`) VALUES (10003, 'dingdan003', 10002, '2023-03-14 17:03:40');
          INSERT INTO  `user_order` (`id`, `order_num`, `user_id`, `create_time`) VALUES (10004, 'dingdan004', 10002, '2023-03-14 17:03:40');
          INSERT INTO  `user_order` (`id`, `order_num`, `user_id`, `create_time`) VALUES (10005, 'dingdan005', 10003, '2023-03-14 17:03:40');
          INSERT INTO  `user_order` (`id`, `order_num`, `user_id`, `create_time`) VALUES (10006, 'dingdan006', 10003, '2023-03-14 17:03:40');
          INSERT INTO  `user_order` (`id`, `order_num`, `user_id`, `create_time`) VALUES (10007, 'dingdan007', 10002, '2023-03-14 17:03:40');
          INSERT INTO  `user_order` (`id`, `order_num`, `user_id`, `create_time`) VALUES (10008, 'dingdan008', 10001, '2023-03-14 17:03:40');

          (2)(3)中腳本執行完的結果:

          3.編寫存儲過程腳本

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          63
          64
          65
          66
          67
          68
          69
          70
          71
          DELIMITER //
          DROP PROCEDURE
          IF
              EXISTS statistics_user_order // CREATE PROCEDURE statistics_user_order () BEGIN
              DECLARE
                  temp_table_name VARCHAR ( 60 ) DEFAULT '';
              DECLARE
                  suffix VARCHAR ( 10 ) DEFAULT '';
              DECLARE
                  old_table_name VARCHAR ( 60 ) DEFAULT NULL;
              SELECT
                  table_name INTO old_table_name
              FROM
                  information_schema.`TABLES`
              WHERE
                  table_name LIKE 'temp_statistics_%'
                  AND table_schema = 'db_name'; -- 此處填自己對應的數據庫名即可
              IF
                  old_table_name IS NOT NULL THEN
                  -- execute multiple statements
                  -- 如果IF THEN ... END IF塊內有多個語句,最好將它們放在一個BEGIN ... END;塊中
                  BEGIN
                           
                          SET @drop_sql := CONCAT( 'DROP TABLE ', old_table_name, ';' );
                      PREPARE d_sql
                      FROM
                          @drop_sql;
                      EXECUTE d_sql;
                      DEALLOCATE PREPARE d_sql;
                       
                  END;
                   
              END IF;
              SELECT
                  DATE_FORMAT( NOW(), '%Y%m%d' ) INTO suffix;
               
              SET temp_table_name = CONCAT( 'temp_statistics_', suffix );
               
              SET @create_sql = CONCAT( 'create table if not exists ', temp_table_name, "(
                  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
                  `user_id` INT ( 11 ) NOT NULL COMMENT '用戶ID',
                  `name` VARCHAR ( 30 ) NOT NULL COMMENT '用戶名',
                  `number` INT ( 11 ) NOT NULL DEFAULT 0 COMMENT '訂單數',
                  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
                  PRIMARY KEY ( `id` ) USING BTREE
              ) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用戶訂單統計表';" );
              PREPARE pre_stmt
              FROM
                  @create_sql;
              EXECUTE pre_stmt;
              DEALLOCATE PREPARE pre_stmt;
              -- 簡單的用set或者declare語句定義變量,然后直接作為sql的表名是不行的,mysql會把變量名當作表名。
              SET @insert_sql = CONCAT( 'INSERT INTO ', temp_table_name, "( `user_id`, `name`, `number` ) SELECT
                  i.id AS `user_id`,
                  i.`name` AS `name`,
                  COUNT( o.user_id ) AS `number`
                  FROM
                  user_info i
                  LEFT JOIN user_order o ON i.id = o.user_id
                  WHERE
                  i.`status` = 1
                  GROUP BY
              i.id;" );
              PREPARE pre_insert
              FROM
                  @insert_sql;
              EXECUTE pre_insert;
              DEALLOCATE PREPARE pre_insert;
               
          END //
          DELIMITER;

          腳本執行結果:(注意:上述存儲過程中的數據庫不要忘記更改"AND table_schema = 'db_name'; -- 此處填自己對應的數據庫名即可")

          以上存儲過程主要分為三個階段

          a.檢查數據庫中臨時表是否存在,如果存在則刪除表結構(移除老表)

          b.根據當前時間創建新的臨時表,表結構根據統計需要增加字段

          c.聯表查詢,將每個用戶所擁有的訂單數量統計,并插入到臨時表中去

          4.編寫和執行定時任務腳本

          為了讓大家看到更顯著的效果,將定時任務設置為每10秒鐘執行一次,也就是這個定時任務的功能是10s鐘統計一次用戶的訂單數量。

          1
          2
          3
          4
          create event job_statistics -- 是創建名為job_statistics的事件;
          on schedule every 10 SECOND -- 創建周期定時的規則,意思是每10s種執行一次;
          on completion preserve enable --  是表示創建后就開始生效,不讓開始生效設置disable
          do call statistics_user_order(); -- 事件要執行的內容,調用了上述的存儲過程

          腳本執行結果:

          查看定時任務:

          1 select * from information_schema.EVENTS;

          腳本執行結果:

          查看定時任務執行效果:(看下面的時間差,定時在刷新)

          停止定時任務執行:

          1 ALTER event job_statistics on completion preserve disable;

          繼續定時任務:

          1 ALTER event job_statistics on completion preserve enable;

          到此這篇關于利用Mysql定時+存儲過程創建臨時表統計數據的文章就介紹到這了

          分享到:

          相關信息

          • Mysql指定某個字符串字段前面幾位排序查詢方式

            指定某個字符串字段前面幾位排序查詢 數據樣例 第一步(想辦法先截取到 ORDER關鍵字前面的 值) 第二步,直接根據NO排序即可? (有坑) 第三步轉換排序...

            2023-03-17

          • Mysql存儲二進制對象數據問題

            Mysql存儲二進制對象數據 首先數據庫存儲一個Object對象 與數據庫對應的實體類 編寫一個操作二進制的工具類 Mysql存儲二進制大型對象類型對照 MySql MediumBlob——MySql的Bolb四種類型...

            2023-03-15

          系統教程欄目

          欄目熱門教程

          人氣教程排行

          站長推薦

          熱門系統下載

          玩家必看科普!麻豆人人妻人人妻人人片AV,欧美老妇交乱视频在线观看,久久综合九色综合久99_知乎 人人玩人人添人人澡超碰偷拍 青春娱乐视频精品分类官网2 最好最新高清中文字幕 91国自产拍最新2018 欧美精品一区二区三区不卡网 深夜你懂得我的意思2021 宿舍NP乖把腿张开H 网恋奔现一天被要几次 为什么我越叫他越快 学渣各种各样的PLAY 英语课代表下面好软小说 亚洲国产综合在线区尤物 FREE性丰满HD性欧美 我年轻漂亮的继坶BD 最近中文字幕完整免费视频 啦啦啦免费视频卡一卡二 青柠视频在线观看大全 在线天堂WWW在线资源 亚洲国产日本韩国欧美MV 天天学习|久久久久久久精品国产亚洲87 国产K频道分享系统进入口 三个嘴都吃满了还塞满了 JAPONENSIS老师学生JAVAHBB 亚洲精品1卡2卡3卡4卡 樱花草在线社区WWW韩国 好涨水快流出来了快吃动视频 久久AV无码精品人妻出轨