Кэширование многомиллионной базы MySQL

топ 100 блогов ru_highload04.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:
Да, доля апдейтов/инсертов будет ничтожна по сравнению с селектами.

Оставить комментарий

Предыдущие записи блогера :
Архив записей в блогах:
   Как бы многие не осуждали Ким Чен Ира - лидера КНДР, а все-таки его народ действительно о нем скорбит. Кто бы, что не говорил, а его уважали и почитали. А что можно сказать про наше отношение к российской власти? Очень хотелось бы тоже ее и ...
                 Эта фраза является высказыванием моего любимого дядюшки – натурального тролля. Ему же принадлежат такие же не менее меткие цитаты в отношение вашей покорной слуги как: «Молчи – за умную ...
Есть знания, которые действительно достоверны. Иногда они достоверны не в той форме, в какой вы привыкли их воспринимать. Возможно, не в той форме вам их преподнесли. Тогда сознание образует пространства перехода, в котором формируется много гипотез. Как у любой новости, картину ...
Есть такая misconception относительно меня, которую я встречал и у весьма близких мне по взглядам людей. Многие предполагают, что я большой пацифист. Это не так. Более того, один из, наверное, главных пунктов, в которых я расхожусь с так называемыми progressives, это как раз "No more ...
19:04:22 : Начинается... несогласованная акция с требованием отставки Лужкова на Тверской пл. - http://bit.ly/cOytLj 19:06:48 : @ gudkovd видимо неплохо @Prawdzinski поработал для популяризации twitterа на родной костромщине! 19:13:49 : Усиливается информ.атака на Юрия ...