медленное соединение на столе (10 тыс. строк)

0

У меня есть действия таблицы (30 строк) и pass_actions (10k строк)

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

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

и pass_actions (~ 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 процессор (цифровая капелька океана)

  • 1
    Что такое tests.id ? Разве это не должен быть actions.id ?
  • 1
    В вашем JOIN отсутствует целевая таблица и ключевое слово ON . И откуда взялись tests ? Пожалуйста, оставьте правильный запрос. А также план выполнения.
Показать ещё 5 комментариев
Теги:
database

3 ответа

0
Лучший ответ

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

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

1- Восстановить статистику по индексу и обновлению 2- Выбрать Только столбец, который вы хотите использовать 3-, запустите этот запрос в новом запросе и нажмите "Щелкните правой кнопкой мыши" и нажмите "Отобразить оценочный план выполнения" и просмотрите отсутствующий индекс Детали и постройте требуемый индекс и снова запустите запрос

0

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

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

(Я не вижу, откуда берутся test.id, боюсь.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню