加载前请求超时,有什么方法可以加快MySql查询的过程吗?

时间:2019-05-24 15:28:24

标签: mysql indexing query-optimization

因此,我尝试合并两个表,一个表具有超过300,000行,而另一个表具有大约35,000行。

当尝试完成此查询时,当我使用“ LEFT OUTER JOIN”以从左手表中获取所有数据以及两者中的所有数据时,它只是超时。

我也尝试过使用“ Explain”,并且看到它查询另一个数据库时,它不使用我为其创建的任何索引,而是查询整个表

SELECT
username as e,
MAX(country) as country, #this is kinda a hacky way to avoid grouping
COALESCE(SUM(a.clicks),0) as clicks,
COALESCE((SELECT COUNT(*) FROM Finance WHERE username=e),0) + COALESCE(SUM(a.registrations),0) as reg,
COALESCE((SELECT COUNT(*) FROM Finance WHERE deposits > 0 AND username=e),0) + COALESCE(SUM(a.ftds),0) as ftds,
COALESCE((SELECT SUM(deposits) FROM Finance WHERE username=e),0) + COALESCE(SUM(a.deposits),0) as deposits,
 COALESCE((SELECT SUM(netcash) FROM Finance WHERE username=e),0) + COALESCE(SUM(a.netrevenue),0) as netcash,
COALESCE(SUM(a.commission),0) as commission
fROM Finance p
LEFT OUTER JOIN xmldata.AllResults a ON SUBSTRING_INDEX(site, "-", 1) = username
GROUP BY username
LIMIT 10000

这是“说明”:

+----+--------------------+-----------------+------------+-------+-------------------------------+-------------------------------+---------+------+--------+----------+----------------------------------------------------+
| id | select_type        | table           | partitions | type  | possible_keys                 | key                           | key_len | ref  | rows   | filtered | Extra                                              |
+----+--------------------+-----------------+------------+-------+-------------------------------+-------------------------------+---------+------+--------+----------+----------------------------------------------------+
|  1 | PRIMARY            | p               | NULL       | index | playerdbfinance_email_country | playerdbfinance_email_country | 388     | NULL | 377031 |   100.00 | Using index; Using temporary; Using filesort       |
|  1 | PRIMARY            | a               | NULL       | ALL   | NULL                          | NULL                          | NULL    | NULL |  32765 |   100.00 | Using where; Using join buffer (Block Nested Loop) |
|  5 | DEPENDENT SUBQUERY | PlayerDBFinance | NULL       | ref   | playerdbfinance_email_country | playerdbfinance_email_country | 194     | func |      2 |   100.00 | NULL                                               |
|  4 | DEPENDENT SUBQUERY | PlayerDBFinance | NULL       | ref   | playerdbfinance_email_country | playerdbfinance_email_country | 194     | func |      2 |   100.00 | NULL                                               |
|  3 | DEPENDENT SUBQUERY | PlayerDBFinance | NULL       | ref   | playerdbfinance_email_country | playerdbfinance_email_country | 194     | func |      2 |    33.33 | Using where                                        |
|  2 | DEPENDENT SUBQUERY | PlayerDBFinance | NULL       | ref   | playerdbfinance_email_country | playerdbfinance_email_country | 194     | func |      2 |   100.00 | Using index                                        |
+----+--------------------+-----------------+------------+-------+-------------------------------+-------------------------------+---------+------+--------+----------+----------------------------------------------------+

1 个答案:

答案 0 :(得分:1)

四个相关子查询是一个性能问题。 p和a之间的 cross join 是另一个大问题。

通过使用GROUP BY来计算所有子查询的派生表来解决此问题。然后JOIN finance USING(username)完成任务。

a的使用只需一次。

SELECT f.username, x.reg, ...
    FROM ( SELECT COALESCE(SUM(a.registrations),0) AS reg, ... ) AS a
    JOIN ( SELECT
                  COALESCE ... AS reg,
                  COALESCE ...
                  COALESCE ...
                  COALESCE ...
              FROM finance
              GROUP BY username ) AS x
    JOIN finance AS f USING(username)

U!情况变得更糟

SUBSTRING_INDEX(site, "-", 1) = username

更改架构,因此您无需执行SUBSTRING_INDEX

尝试做一些提示,然后为每个表返回SHOW CREATE TABLE