简体   繁体   English

优化MySQL CREATE TABLE查询

[英]Optimizing MySQL CREATE TABLE Query

I have two tables I am trying to join in a third query and it seems to be taking far too long. 我有两个表正在尝试加入第三个查询,这似乎花费了太长时间。

Here is the syntax I am using 这是我正在使用的语法

CREATE TABLE active_users
(PRIMARY KEY ix_all (platform_id, login_year, login_month, person_id))
SELECT platform_id
    , YEAR(my_timestamp) AS login_year
    , MONTH(my_timestamp) AS login_month
    , person_id
    , COUNT(*) AS logins
FROM
    my_login_table
GROUP BY 1,2,3,4;

CREATE TABLE active_alerts
(PRIMARY KEY ix_all (platform_id, alert_year, alert_month, person_id))
SELECT platform_id
    , YEAR(alert_datetime) AS alert_year
    , MONTH(alert_datetime) AS alert_month
    , person_id
    , COUNT(*) AS alerts
FROM 
    my_alert_table
GROUP BY 1,2,3,4;

CREATE TABLE all_data
(PRIMARY KEY ix_all (platform_id, theYear, theMonth, person_id))
SELECT a.platform_id
    , a.login_year AS theyear
    , a.login_month AS themonth
    , a.person_id
    , IFNULL(a.logins,0) AS logins
    , IFNULL(b.alerts,0) AS job_alerts
FROM
    active_users a
LEFT OUTER JOIN
    active_alerts b
        ON a.platform_id = b.platform_id
        AND a.login_year = b.alert_year
        AND a.login_month = b.alert_month
        AND a.person_id = b.person_id;

The first table (logins) returns about half a million rows and takes less than 1 minute, the second table (alerts) returns about 200k rows and takes less than 1 minute. 第一个表(登录)返回大约50万行,耗时不到1分钟,第二个表(警报)返回大约20万行,耗时不到1分钟。

If I run just the SELECT part of the third statement it runs in a few seconds, however as soon as I run it with the CREATE TABLE syntax it takes more than 30 minutes. 如果仅运行第三条语句的SELECT部分​​,它将在几秒钟内运行,但是,一旦使用CREATE TABLE语法运行它,则将花费30多分钟。

I have tried different types of indexes than a primary key, such as UNIQUE or INDEX as well as no key at all, but that doesn't seem to make much difference. 我尝试过与主键不同的索引类型,例如UNIQUE或INDEX以及根本没有键,但这似乎并没有太大的区别。

Is there something I can do to speed up the creation / insertion of this table? 我可以做些什么来加快此表的创建/插入吗?

EDIT: Here is the output of the show create table statements 编辑:这是显示创建表语句的输出

CREATE TABLE `active_users` (
  `platform_id` int(11) NOT NULL,
  `login_year` int(4) DEFAULT NULL,
  `login_month` int(2) DEFAULT NULL,
  `person_id` varchar(40) NOT NULL,
  `logins` bigint(21) NOT NULL DEFAULT '0',
  KEY `ix_all` (`platform_id`,`login_year`,`login_month`,`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

CREATE TABLE `alerts` (
  `platform_id` int(11) NOT NULL,
  `alert_year` int(4) DEFAULT NULL,
  `alert_month` int(2) DEFAULT NULL,
  `person_id` char(36) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
  `alerts` bigint(21) NOT NULL DEFAULT '0',
  KEY `ix_all` (`platform_id`,`alert_year`,`alert_month`,`person_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

and the output of the EXPLAIN 和EXPLAIN的输出

id  select_type table   partitions  type    possible_keys   key key_len ref rows    filtered    Extra

1   SIMPLE  a   (null)  ALL (null)  (null)  (null)  (null)  503504  100 (null)

1   SIMPLE  b   (null)  ALL ix_all  (null)  (null)  (null)  220187  100 Using where; Using join buffer (Block Nested Loop)

It's a bit of a hack but I figured out how to get it to run much faster. 这有点hack,但我想出了如何使其运行得更快的方法。

I added a primary key to the third table on platform, year, month, person 我在平台的第三张表,年,月,人上添加了主键

I inserted the intersect data using an inner join, then insert ignore the left table plus a zero for alerts in a separate statement. 我使用内部联接插入了相交数据,然后插入忽略左表,并在单独的语句中添加零警报。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM