Чрезвычайно медленный запрос - Использование Google SQL Cloud - PullRequest
0 голосов
/ 11 ноября 2018

Есть ли способ, которым я могу ускорить это? Прямо сейчас это занимает невероятно безумное количество времени, чтобы запросить.

SELECT trades.*, trader1.user_name as trader1_name,
trader2.user_name as trader2_name FROM trades
LEFT JOIN logs_players trader1 ON trader1.user_id = trader1_account_id
LEFT JOIN logs_players trader2 ON trader2.user_id = trader2_account_id
ORDER BY time_added
LIMIT 20 OFFSET 0;

Я сделал все возможное, чтобы найти решение в Интернете. Или даже просто пытаюсь получить больше информации, почему это занимает так много времени.

Выполнение запроса занимает около 45 секунд.

Создание выписок:

CREATE TABLE `trades` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `trader1_account_id` int(11) DEFAULT NULL,
  `trader2_account_id` int(11) DEFAULT NULL,
  `trader1_value` bigint(20) DEFAULT NULL,
  `trader2_value` bigint(20) DEFAULT NULL,
  `trader1_ip` varchar(16) DEFAULT NULL,
  `trader2_ip` varchar(16) DEFAULT NULL,
  `world` int(11) DEFAULT NULL,
  `x` int(11) DEFAULT NULL,
  `z` int(11) DEFAULT NULL,
  `level` int(11) DEFAULT NULL,
  `trader1_user` varchar(12) DEFAULT NULL,
  `trader2_user` varchar(12) DEFAULT NULL,
  `time_added` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8


CREATE TABLE `logs_players` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `user_name` varchar(20) DEFAULT NULL,
  `world_stage` varchar(20) DEFAULT NULL,
  `world_type` varchar(20) DEFAULT NULL,
  `bank` longtext,
  `inventory` longtext,
  `equipment` longtext,
  `total_wealth` mediumtext,
  `total_play_time` mediumtext,
  `rights` int(11) DEFAULT NULL,
  `icon` int(11) DEFAULT NULL,
  `ironmode` int(11) DEFAULT NULL,
  `x` int(11) DEFAULT NULL,
  `z` int(11) DEFAULT NULL,
  `level` int(11) DEFAULT NULL,
  `last_ip` varchar(16) DEFAULT NULL,
  `last_online` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `muted_until` timestamp NULL DEFAULT NULL,
  `banned_until` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

1 Ответ

0 голосов
/ 11 ноября 2018

Я заполнил пример базы данных по 10 тыс. Строк в каждой и обнаружил, что вам нужно несколько индексов:

ALTER TABLE `logs_players` ADD INDEX(`user_id`);
ALTER TABLE `trades` ADD INDEX(`time_added`);

Главный индекс, который нам нужен, это индекс user_id. Мы изменили время запроса от 20,1390 секунд до 0,0130 секунд:

Мы можем даже уменьшить это, добавив индекс time_added, чтобы сделать сортировку намного быстрее, теперь у нас получилось впечатляющее время запроса:

Проведите исследование по индексам! Простой запрос EXPLAIN покажет вам, что вы используете сортировку файлов (что довольно плохо!):

После индексов это выглядит намного лучше:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...