У меня есть действия таблицы (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 процессор (цифровая капелька океана)
Ваш запрос на самом деле достаточно быстрый. Иногда коррелированный подзапрос может помочь:
select a.*
from actions a
order by (select count(*) from passed_actions pa where pa.action_id = a.id) desc;
Это может использовать указатель, который вы определили для passed_actions(action_id)
.
1- Восстановить статистику по индексу и обновлению 2- Выбрать Только столбец, который вы хотите использовать 3-, запустите этот запрос в новом запросе и нажмите "Щелкните правой кнопкой мыши" и нажмите "Отобразить оценочный план выполнения" и просмотрите отсутствующий индекс Детали и постройте требуемый индекс и снова запустите запрос
Если все, что вы хотите от второй таблицы, - это счет для сортировки, как кажется, так, попробуйте (непроверенный, извините):
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, боюсь.)
tests.id
? Разве это не должен бытьactions.id
?JOIN
отсутствует целевая таблица и ключевое словоON
. И откуда взялисьtests
? Пожалуйста, оставьте правильный запрос. А также план выполнения.