Кэширование многомиллионной базы MySQL
ru_highload — 04.03.2010 Есть MySQL база со 100 миллионами записей (телефонные номера).Стоит задача придумать оптимальный способ кэширования.
Имхо, memcache не совсем подходит, так как записей в таблице очень много, и memcache их всех в памяти держать не сможет. Еще один нюанс - не будет такого, что один номер телефона будет искаться часто (то есть, не будет такого, что один номер будут искать 10000 раз в сутки, а другой - 1). Распределение между номера будет более-менее равномерным.
Подумав, я пришел к следующему варианту. Допустим, есть URL вида "site.ru/1234567.html". Настраиваем Apache так, чтобы он отдавал реальный файл по этому адресу (если файл существует), если файл не существует - идет перенаправление на скрипт, который делает запросы в базу, отрисовывает страничку и сохраняет ее. Когда следующий посетителей зайдет на эту же страничку, то Apache отдаст ему уже созданный файл.
Какую-то динамику (допустим, комментарии) можно подгружать через AJAX.
Собственно, вопросы:
1) Верны ли мои рассуждения о memcache?
2) Какие недостаки у предложенного мной метода?
3) Подойдет ли под эту схему Apache, или какой-то другой веб-сервер будет эффективней?
4) Может быть, существуют способы лучше, чтобы справиться с этой задачей?
Update:
Планируемая посещаемость - один миллион посетителей в сутки.
Опишу задачу:
- Есть база телефонных номеров
- Есть база людей.
На один телефонный номер могут быть привязаны несколько людей. Также есть "история" номера (какие люди были к нему привязаны в прошлом).
Необходимо осуществлять 2 вида поиска - по номеру телефона и по фамилии человека. Оба вида поиска в итоге должны отображать (или вести на) страницу телефонного номера. Грубо говоря, весь сайт - это страницы вида .ru/1234567.html, .ru/2234567.html, и тд.
Чтобы избежать JOIN'ов, я пришел к такому решению:
В таблице phone_numbers создаем поля 'owners' и 'owners_archive' (соответсвенно, текущие "владельцы" и прошлые"). В них хранятся сериализованные массивы данных о людях (имя, фамилия, номера аккаунтов в социальных сетях, и тд.).
В таблице persons в одном поле через запятую храним все номера телефонов, привязанные к этому человеку.
Если ищем по телефоному номеру, то все данные берутся через один запрос из таблицы phone_numbers.
Если ищем по фамилии, то через один запрос из таблицы persons получаем все номера телефонов и выводим прямые ссылки на них.
Update 2:
Да, доля апдейтов/инсертов будет ничтожна по сравнению с селектами.