@burov0798
Пытаюсь изучать php\js

Как оптимизировать выборку из Mysql?

Добрый день. Возникла такая задача.
Есть в базе таблица, к примеру: data
id--uid--type--lvl--country--isoc
--------------------------------------
1--010211--test--gold--russia--ru
2--023231--reter--class--brazil--br
3--412125--tdfg--gold--usa--us

И так около 300к строк.
Приходит запрос на 10000 строк, для каждой по значению uid мне нужно выбрать type, lvl, country и isoc.
Следовательно, я просто в цикле прохожу по каждой пришедшей строчке и выполняю запрос:
SELECT * FROM data WHERE uid = $uid;

и если нашло, то забираю нужные данные и пока не закончатся строки.
Возможно ли как то оптимизировать данную выборку? Возможно хранить изначально 300к данных не в Mysql, а в json с php скриптом?
  • Вопрос задан
  • 110 просмотров
Решения вопроса 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
И за какое время у вас отрабатывает 10000 SELECT'ов? Индекc на uid есть + LIMIT 1?

10тыс SELECT'ов на таблице в 300тыс строк, при условии что на uid есть индекс должно выполняться за 1-2 секунды на нормальной машине.
Не вижу необходимости что-либо оптимизировать.
Можно разве что минимизировать кол-во данных передаваемых по сети и вместо SELECT * использовать SELECT type, lvl, country, isoc так как лишние данные, это лишние задержки.

БД создана для того чтобы работать, нет смысла её жалеть.

- Другой вариант, если позволяет память - выбирать все строки из базы одним SELECT'ом и потом фильтровать в приложении.
- Можно прикрутить memсached для кеширования так как по сути у вас key-value выборка
- Выбрать другое хранилище (Redis, tarantool) где скорость выборки по ключу будет выше

upd. Можно несколько SELECT'ов группировать в один запрос через IN
SELECT ... FROM table WHERE uid IN(uid1, uid2, uidN)

Этим можно уменьшить суммарное кол-во SELECT'ов, но не факт что в итоге данные получите быстрее.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы