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

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

Предыдущие записи блогера :
Архив записей в блогах:
Прошу честь, уважаемые читатели, что в этом посте нет ни одного моего слова, я просто собрал по интернету точки зрения самых разных людей, достаточно информированных, так как дисскусия вокруг последних высказываний Игоря Ивановича, не утихает. Мой друг, вежливый, умный и информированный, ...
...
Алексей Навальный выпустил серию агитационных плакатов для выборов оппозиции со скандально известной порнозвездой. Сейчас все агитматериалы распространяются на ресурсах Навального "РосАгит" и "Добрая Машина Пропаганды", а также в блоге ...
Чувствуя себя капитаном Очевидность, всё-таки скажу: чем меньше у человека свободного времени, тем трепетнее и бережнее он к нему относится. Сразу и чётко расставляются приоритеты, на что ты готов потратить драгоценные часы. Поэтому я приветствую сервисы, которые призваны решить для ...
Сколько лет вашим детям? 11 уже есть? Пацан есть? Посмотрите на него. Обнимите. Поцелуйте. Заройтесь в его волосы и живите им. 11. Ведь это еще совсем ребенок. Вам ...