因此,我尝试合并两个表,一个表具有超过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 |
+----+--------------------+-----------------+------------+-------+-------------------------------+-------------------------------+---------+------+--------+----------+----------------------------------------------------+
答案 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
。