Здравствуйте
Меня интересует теоретический вопрос по строению и выбору баз данных для крупных проектов.
Для примера возьмем такие проекты как социальные сети, сайты по изучению иностранных языков, глобальные чат системы, например twitter.
Возьмем сайт по изучению иностранных языков например LinguaLeo число пользователей 16 миллионов, там есть вкладка словарик, в которой добавляются выбранные тобой слова, меня интересует как это происходит и как это реализуется.
Как я понял 1 таблицы для данных пользователей 1на со словами и 1на для избранных слов всех пользователей, пользователь заходит на сайт под своей сессией, заходит в свой словарик и ему по его id пользователя вытаскиваются слова из общей таблицы избранных слов. И вот тут мне не понятно, там в таблице миллиарды слов, каким образом за секунду будет обработан запрос найти среди этих слов избранные слова пользователя.
Или используются другие способы и специальные базы данных при такой нагрузке для реализации этого?
Допустим что LinguaLeo использует MySQL. Нужно сказать что LinguaLeo это 36,300 посещений в день. И если разделим на 24 и допустим что со всего мира на сайте сидит 1.5к постоянно в онлайне (очень приблизительно). Или в пиках даже пусть 5к одновременно и 95% всех запросов к таблице MySQL это запросы типа SELECT ...
то с такой задачей справится без проблем обычный сервер на два ксеона и 4 диска в раиде 0. Поверьте. Правильно настореная MySQL БД может просто очень-очень быстро работать. И такого стака как PHP
и MySQL
может быть очень предостаточно.У MySQL
очень быстро работают SELECT ..
запросы. У noSQL
быстрее работают INSERT ..
подобные запросы. Twitter скорее использует noSQL
потому что у них нужно много записывать одновременно. Хотя вот я нашел стак технологии твиттера.
2006 Ruby on Rails MySQL
2008+ Ruby on Rails MySQL (TweetStore, Flock) Redis, Memcache
2010+ Netty (reverse proxy) JVM (java, scala) MySQL (TweetStore, Flock, etc) Redis, Memcache
Как ни странно что твиттер использует MySQL
. Хотя впоне логично что небольшие INSERT ..
подобные запросы для сохранения твитов в MySQL
проходят тоже довольно таки быстро. И тоже видно что они с руби (который был как бэкенд в начале) перешли на джаву в 2010м году.
К вопросу как это происходит (со словарем). Стак технологий js, jquery, mysql
. Insert data through ajax into mysql database описание как записать данные в mysql
.
Во-первых, нужно определиться, что нужно: latency или throughput.
Разные части системы оптимизируют разные задачи.
В примере про словарь используется кеширование данных - при многократных обращениях к данным запрос в базу идет всего несколько раз.
На уровне базы используется репликация данных для отказоустойчивости и распределении нагрузки между серверами.
Можно выделить 1 нагруженную таблицу на отдельный сервер. Это будет вертикальный шардинг.
Если не хватает, то можно распределять 1 таблицу между хостами - горизонтальный шардинг.
Это базовые подходы любого высоконагруженного проекта.
Помимо SQL-баз данных есть еще технологии NoSQL и способы изначально структурированного хранения данных в виде объектов, массивов, коллекций и пр. Например, в JSON или XML.
В случае с LinguaLeo и соцсетями именно так все и работает. Все данные профиля, настройки, предпочтения, словарики и слова хранятся в объектах JSON, которые по сути своей ничего общего с SQL не имеют. Запросы к ним строятся по-другому.
Когда пользователь логинится в систему, его данные/метаданные подгружаются из объектов JSON и "расставляются" по атрибутам/переменным.
Уверен, это может стать интересной темой, если найти время и копнуть основы JSON и NoSQL поглубже. Готов поспорить, что на базовых примерах многое будет понятно.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
I have a problemSome time ago code bellow stoped working
Знаю что у обычного цикла while есть внутри условие остановки: while ($i <= 10)
Доброго времени суток!Проблема в следующем - пытаюсь вставить подготовленную дату в базу в поле типа datetime, запрос отрабатывает без ошибок,...
Я получаю картинку из инпута, вот dd переменной которая получает весь гет и пост: