Как ускорить выборку ( freeing items, cleaning up) из InnoDB по primary key?



@ivinnic

Добрый день!

Делаю запрос по таблице в которой 100 записей по полю id (PK)

select * from table_name where id = n

и результат 1.8ms – из которых 1ms – это freeing items и cleaning up.
Почему это может происходить, и как можно это ускорить?
Диск ssd nvme; Mysql 8; InnoDB;

Когда необходимо сделать 100 запросов это 100ms, что конкретно чувствуется… нагугить не удалось…

Profile:
61150f50df138554293287.jpeg


Решения вопроса 0


Ответы на вопрос 5



@ThunderCat

Похоже что логичнее хранить ваши данные в каком-то кей-валуе хранилище, в том же редисе, например…



@Fragster

Вроде бы это все происходит уже после возврата данных клиенту, по этому сама обработка будет с точки зрения клиента быстрее. А там и серверов добавить можно, если что.
К тому же в некоторых библиотеках, вроде бы, можно делать выборку из разных таблиц одним запросом (не джоины и даже не юнионы, а именно несколько запросов через ; ).

Еще такое может быть, если лог файлы забиты, медленные диски и т.п.
Попробуй innodb_flush_log_at_trx_commit = 2

если что – во доки: https://dev.mysql.com/doc/refman/8.0/en/general-th…



@ky0

Две миллисекунды вас не устраивают? А почему, позвольте спросить? У вас высоконагруженный проект, в котором выполняются тысячи подобных запросов в секунду или вы просто решили поиграть в преждевременную оптимизацию (с)?

Когда необходимо сделать 100 запросов это 100ms

Для read-only запросов это так не работает – даже если конкретно эти данные не хранятся в памяти, у вас SSD прекрасно может отдавать данные параллельно.



@BojackHorseman Куратор тега MySQL

делать запросы параллельно, а не последовательно



@rPman

where id in (…) работает не быстрее?
ок, залей нужные id в temporary table и делай from table,temp…

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *