Mysql

如何使用 mySql 複製改進查詢計數執行?

  • February 27, 2022

對於我的報告,我必須使用計數查詢(例如名稱’user_activity’),然後按另一個表(使用者表)中的另一列(user_type)分組。

當涉及到百萬條記錄數據時,它真的很耗時。所以我決定使用 mySql Replicate 來創建一個從數據庫用於我的報告目的。但我仍在為這些事情苦苦掙扎:

  1. 您是否願意複製數據庫的一部分以換取查詢速度?
  2. 同步時,有什麼方法可以在“user_activity”表(從屬數據庫)中自動將數據添加到 user_type 列?
  3. 以及如何優化數據庫以供閱讀?(報告數據,分析,..)

更新:這是我的創建 sql

表使用者

CREATE TABLE `library_th`.`user` (
`id` INT UNSIGNED NOT NULL ,
`使用者名` VARCHAR(100) NOT NULL ,
`password` VARCHAR(32) NOT NULL ,
`user_type` TINYINT NOT NULL DEFAULT '0' COMMENT '這個使用者是系統自動創建的還是他們自己創建的?,
主鍵(`id`)
) 引擎 = InnoDB;

表使用者活動:

如果不存在`user_activity`,則創建表(
`id` int(10) 無符號非空,
`user_id` int(10) 無符號非空,
`action` int(11) NOT NULL DEFAULT '0' COMMENT '使用者做了什麼活動?',
`datetime_created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP
) 引擎=InnoDB 預設字元集=utf8;
更改表`user_activity`
添加 KEY `user_id` (`user_id`);

我想使用的計數查詢是:

從 user_activity ua 中選擇 count(ua.id) 作為 `total`, u.user_type, ua.action
在 ua.user_id = u.id 上內部加入使用者 u
按 ua.action、u.user_type 分組

試試這個:

將此復合索引添加到user_activity: INDEX(user_id, action)。然後

SELECT SUM(x.ct), u.user_type, x.action
   FROM (
       SELECT user_id, action, COUNT(*) AS ct
           FROM user_activity
           GROUP BY user_id, action
        ) x
   JOIN user u  ON x.user_id = u.id
   GROUP BY x.action, u.user_type;

在數據倉庫中,“匯總表”對性能非常重要。

匯總表包含每天(或其他時間段)的計數和小計。然後使用匯總表執行“報告”,例如您的查詢,並且執行速度比針對“原始”數據執行快得多。

對於您的情況,建構並增量維護一個表,例如:

day、user_type、action、count

前 3 列是PRIMARY KEY,最後一個是小計。

您需要一個索引datetime_created以使其更有效地進行夜間更新。

引用自:https://dba.stackexchange.com/questions/143839