Mysql
如何使用 mySql 複製改進查詢計數執行?
對於我的報告,我必須使用計數查詢(例如名稱’user_activity’),然後按另一個表(使用者表)中的另一列(user_type)分組。
當涉及到百萬條記錄數據時,它真的很耗時。所以我決定使用 mySql Replicate 來創建一個從數據庫用於我的報告目的。但我仍在為這些事情苦苦掙扎:
- 您是否願意複製數據庫的一部分以換取查詢速度?
- 同步時,有什麼方法可以在“user_activity”表(從屬數據庫)中自動將數據添加到 user_type 列?
- 以及如何優化數據庫以供閱讀?(報告數據,分析,..)
更新:這是我的創建 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
以使其更有效地進行夜間更新。