ПРОБЛЕМА С НИЗКОЙ ПРОИЗВОДИТЕЛЬНОСТЬЮ ЗАПРОСА К ЖУРНАЛУ УЧАСТНИКА MYSQL

#php #mysql #query-optimization #where-clause #mysql-5.7

#php #mysql #оптимизация запроса #where-предложение #mysql-5.7

Вопрос:

У меня есть таблица, в которую я регистрирую участников.

Здесь 1 486 044 записи.

 SELECT * FROM `user_log` WHERE user = '1554143' order by id desc
  

Однако этот запрос занимает 5 секунд. Что вы рекомендуете?

Построение таблицы ниже;

 CREATE TABLE IF NOT EXISTS `user_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` int(11) NOT NULL,
  `operation_detail` varchar(100) NOT NULL,
  `ip_adress` varchar(50) NOT NULL,
  `l_date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
COMMIT;
  

Ответ №1:

Для этого запроса:

 SELECT * FROM `user_log` WHERE user = 1554143 order by id desc
  

Вам нужен индекс на (user, id desc) .

Обратите внимание, что я удалил одинарные кавычки вокруг значения фильтрации для user , поскольку этот столбец является числом. Это не обязательно ускоряет работу, но является более чистым.

Также: select * это не очень хорошая практика и не очень хорошо для производительности. Вы должны перечислить нужные столбцы в результирующем наборе (если они вам не нужны, не выделяйте их все). Если вам нужны все столбцы, поскольку в вашей таблице не так много столбцов, вы можете попробовать использовать покрывающий индекс для всех 5 столбцов, например: (user, id desc, operation_detail, ip_adress, l_date) .

Комментарии:

1. Извините, но это не адекватный ответ. Я хочу, чтобы запрос был быстрым. Приведенный вами пример не имеет к этому никакого отношения.

2. @perfectmorn: Я рекомендовал один индекс (ну, на самом деле, два индекса) для вашего запроса, чтобы он выполнялся быстро. Что вам кажется неадекватным?

3. Можете ли вы объяснить это на примере полного кода. То же самое, если мне нужно внести изменения в таблицу.

4. @perfectmorn: просто используйте create index , как в: create index myidx on user_log(user, id desc) .

5. Хорошо. Я только что проиндексировал столбец user, и произошло значительное увеличение производительности. Что именно означает определение индекса? Есть ли какие-либо проблемы с записями? Потому что для пользователя может быть введено более одной записи.

Ответ №2:

В дополнение к возможности создания индекса на (user, id), о которой уже упоминалось, вероятно, лучшим вариантом является преобразование таблицы в InnoDB, поскольку создается индекс только на (user).