Время ожидания запроса перед загрузкой, есть ли способ ускорить этот процесс запроса MySql? - PullRequest
0 голосов
/ 24 мая 2019

Итак, я попытался объединить две таблицы: одну таблицу с более чем 300 000 строк и другую с около 35 000 строк.

При попытке выполнить этот запрос просто истекает время, когда я использую "LEFT OUTER"ПРИСОЕДИНЯЙТЕСЬ », чтобы получить все данные из левой таблицы и что находится в обоих.

Я также пытался с «Объяснить», и я вижу, что, когда он запрашивает другую базу данных, он не использует ни один из индексов, которые я для него создал, скорее, он запрашивает всю таблицу

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 Ответ

1 голос
/ 24 мая 2019

Четыре коррелированных подзапроса - это проблема производительности. перекрестное соединение между p и a является еще одной большой проблемой.

Исправьте это, имея производную таблицу, которая вычисляет с 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)

Тьфу! Становится хуже

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

Измените схему, чтобы вам не нужно было выполнять SUBSTRING_INDEX!

Попробуйте сделать то, о чем я намекнул , затем вернитесь с SHOW CREATE TABLE для каждого стола.

...