Ассинхронный сервер против многопоточного?
Ну вот смотри.
Асинхронный сервер — это "как будто" у тебя на каждый запрос клиента создаётся отдельный threading.Thread, только очень быстро. На самом деле, на каждый запрос создаётся генератор (он же — корутина), который скармливается циклу событий, но ради аналогии пойдёт. То есть, у тебя как будто бесконечный пул потоков (практически ограниченный памятью). Пришло 5 клиентов — будет 5 "потоков", пришло 10000 — будет 10000. Ты ничем не ограничен, только оперативной памятью.
Многопоточный сервер — это, чаще всего, фиксированный пул потоков (или комбинация из процессов и потоков). Фиксированный он потому, что создавать потоки — затратная по времени операция, процессы — ещё затратнее. Поэтому всякие gunicorn'ы их спавнят при старте. Если у тебя таких потоков, скажем, 40 штук — это буквально означает, что одновременно обрабатываться могут не более 40 запросов (потому что каждый запрос занимает ровно один поток и отдаст его тогда, когда ответ будет отправлен). То есть, предельный RPS посчитать очень просто — надо 40 разделить на максимальное (или среднее, смотря что считаем) время ответа единичного запроса. Допустим, самый "тупой" запрос отвечает 0.2с, тогда ты сможешь обрабатывать не менее 200RPS. А если среднее время ответа — 0.1с, то ты можешь обрабатывать в среднем 400RPS.
В общем, я к тому, что asyncio стоит использовать всегда, когда твоё приложение чего-то ждёт — БД, ФС, чьё-то API и т.д. То есть, если твоё приложение не умножает миллиарды чисел, не работает с матрицами и прочее.
Вы точно ничего не путаете? 
"Асинхронный" - это характеристика tcp-соединения
"Многопоточный" - это параллелизм.
Если у вас 10000 запросов в секунду, то без многопоточности ваш сервер ляжет.
Выбор BD - это ваш личный выбор. Ориентируйтесь на вопросы:
1. Нужна ли репликация?
2. Каково примерное ожидаемое количество записей?
3. Как удобнее получать выборки? Т.е. это будет реляционка или носкл...
и т.д.