И за какое время у вас отрабатывает 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'ов, но не факт что в итоге данные получите быстрее.