медленное соединение на столе (10 тыс. строк) - PullRequest
0 голосов
/ 24 мая 2018

у меня есть табличные действия (30 строк) и пройденные действия (10 тыс. Строк)

действия таблица:

CREATE TABLE `actions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `category_id` int(10) unsigned NOT NULL,
  `author_id` int(10) unsigned NOT NULL,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `slug` varchar(255) COLLATE utf8_unicode_ci NOT NULL COMMENT 'need for url',
  `about` longtext COLLATE utf8_unicode_ci,
  `image` text COLLATE utf8_unicode_ci,
  `page_title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `page_description` varchar(512) COLLATE utf8_unicode_ci DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '0',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `actions_slug_unique` (`slug`),
  KEY `actions_author_id_foreign` (`author_id`),
  KEY `actions_category_id_foreign` (`category_id`),
  CONSTRAINT `actions_author_id_foreign` FOREIGN KEY (`author_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `actions_category_id_foreign` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

и пройденные_ действия (~ 9500 строк)

CREATE TABLE `passed_actions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `action_id` int(10) unsigned NOT NULL,
  `hash` varchar(6) COLLATE utf8_unicode_ci NOT NULL,
  `public` tinyint(1) NOT NULL DEFAULT '1',
  `successfully_passed` tinyint(1) NOT NULL DEFAULT '0',
  `started_at` timestamp NULL DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `passed_actions_hash_unique` (`hash`),
  KEY `passed_actions_user_id_foreign` (`user_id`),
  KEY `passed_actions_action_id_foreign` (`action_id`),
  CONSTRAINT `passed_actions_action_id_foreign` FOREIGN KEY (`action_id`) REFERENCES `actions` (`id`) ON DELETE CASCADE,
  CONSTRAINT `passed_actions_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=25733 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

этот запрос занимает 0,3-0,5 с:

select
    actions.*
from actions
left join passed_actions.action_id = actions.id
group by actions.id
order by count(passed_actions.id) DESC

это влияет на время отклика моего API ... почему это происходит?я думаю, что 10k строк не большая таблица ...

я использую конфигурацию mysql по умолчанию.Мой сервер 1 Гб оперативной памяти и 1 процессор (цифровая капля океана)

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Ваш запрос на самом деле достаточно быстрый.Иногда может помочь коррелированный подзапрос:

select a.*
from actions a
order by (select count(*) from passed_actions pa where pa.action_id = a.id) desc;

Это может использовать индекс, который вы определили для passed_actions(action_id).

0 голосов
/ 25 мая 2018

1- Перестроить индекс и обновить статистику. 2- Выбрать только столбец, который вы хотите использовать. 3- Запустить этот запрос в новом запросе, нажать «Правый клик», нажать «Показать примерный план выполнения» и просмотреть отсутствующий индекс.Подробно и создайте требуемый индекс и снова выполните запрос

0 голосов
/ 24 мая 2018

Если все, что вы хотите от второй таблицы, это счетчик для сортировки, как кажется, попробуйте (не проверено, извините):

select
    actions.*
from actions
left join (select action_id, count(*) as passed_count from passed_actions group by action_id) p on actions.action_id = p.action_id
order by passed_count DESC

(я не вижу, где tests.idбоюсь.)

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