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

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

Предыдущие записи блогера :
Архив записей в блогах:
Здравствуйте. Кто покупал в Ашане школьную форму, - как оно в плане цены и качества? На сайте магазина указано, что у них есть всё для школы, в том числе, одежда и обувь. Посмотрела цены на школьную форму в спец.магазинах и в детском мире.. прослезилась. Вообще, где вы ее берете - так, ...
Нынешний календарь очень удобен. Все, что тебе нравится, можно праздновать. Любишь рыбу ловить - вот тебе Всемирный день рыболовства, а если целоваться невтерпеж - недавно отпраздновали Всемирный день поцелуев. Чмокай все подряд на законных ...
1. Я занимаюсь астрологией 6 лет. Читала миллион книг, слушала массу аудио и видео-лекций, рассматривала миллион карт, в том числе и в большинстве с точки зрения синастрии и прогностических методов и до сих пор не дошла до уровня профессионализма о котором мечтаю. Т.е. профессионалом я себ ...
Там, потому что прямо сейчас я в Черногории. Безумству храбрых поём мы песню - храбрые полетели в командировку через три дня после операции. Шов болит, но в целом всё прошло гораздо лучше, чем могло бы: опухоль была доброкачественной. Выбираю себе грудь (как тут ещё скажешь), девочки ...
Здравствуйте уважаемые. Тут новый хешмоб открылся #образывойны . Ну, почему нет. Интересно и очень в тему - День Победы скоро. Поэтому, вполне логично будет вспомнить самые яркие и интересные кинокартины про Вторую Мировую войну аоследних нескольких лет.Естественно их было гораздо больше ...