Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите спроектировать базу для огромной переписки
 
 автор: Дрюсик   (19.05.2013 в 19:14)   письмо автору
 
 

Добрый день.

Есть сайт, с внутренней перепиской.
Сообщения пишутся в табличку вида:


CREATE TABLE `messages`(
    `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    `from_id` INT(10) UNSIGNED NOT NULL,      
    `where_id` INT(10) UNSIGNED NOT NULL, 
    `message` VARCHAR(512) NOT NULL,
    `isread` BOOL DEFAULT FALSE,
    `cr_time` DATETIME NOT NULL,    
    PRIMARY KEY (`id`),
    KEY `users` (`from_id`, `where_id`),
    KEY `isread` (`isread`)
)TYPE=MyISAM
DEFAULT CHARSET=utf8
AUTO_INCREMENT=0 
COMMENT = 'Таблица сообщений';


Все бы ничего, но в день отправляют порядка 50 тыс. сообщений.
Чувствую с такой скоростью заполнения я скоро получу раздутую базу и огромные тормоза.
Собственно подскажите как лучше и правильнее организовать переписку на миллиард ;)

Буду рад советам, ссылкам, замечениям по текущей таблице.
Спасибо!

  Ответить  
 
 автор: Valick   (19.05.2013 в 20:13)   письмо автору
 
   для: Дрюсик   (19.05.2013 в 19:14)
 

вряд ли кто подскажет, такого рода информация уже попадает под рамки "свои секреты"
___
количество писем в почтовом ящике ограничено?
существует ли рассылка сообщений, или только переписка?

  Ответить  
 
 автор: Дрюсик   (19.05.2013 в 21:53)   письмо автору
 
   для: Valick   (19.05.2013 в 20:13)
 

Кол-во писем не ограничено.
Существует рассылка от администрации, но это редко, сами юзеры генерят вразы больше.

Есть вариант разбить базу на споты, т.е. хранить в каждой базе например по миллиону сообщений.
message_1 - для первого миллиона
message_2 - для второго миллиона
message_# - для N миллиона


Пока не очень понятно как их клеить, если например в одной переписке сообщения будут разбросаны по разным таблицам. Боюсь что такой подход может отрицательно сказаться на производительности.

  Ответить  
 
 автор: cheops   (21.05.2013 в 08:08)   письмо автору
 
   для: Дрюсик   (19.05.2013 в 21:53)
 

У MySQL есть штатная сегментация таблиц partitional - лучше воспользоваться ей.

  Ответить  
 
 автор: cheops   (21.05.2013 в 08:07)   письмо автору
 
   для: Дрюсик   (19.05.2013 в 19:14)
 

>Все бы ничего, но в день отправляют порядка 50 тыс. сообщений.
>Чувствую с такой скоростью заполнения я скоро получу раздутую базу и огромные тормоза.
>TYPE=MyISAM
InnoDB (правильно настроенный, т.е. сервер должен быть заточен под InnoDB, все остальные таблицы базы данных тоже - иначе потребуется много памяти)

Таблицу пилите на две: messages и messages_text - весь текст выносите во вторую таблицу. Первая таблица будет меньше по объему - запросы с ней будут протекать быстрее.

  Ответить  
 
 автор: cheops   (21.05.2013 в 08:10)   письмо автору
 
   для: Дрюсик   (19.05.2013 в 19:14)
 

>`cr_time` DATETIME NOT NULL,
Замените на UNSIGNED INT, используйте UNIXSTAMP-метку.

  Ответить  
 
 автор: cheops   (21.05.2013 в 08:11)   письмо автору
 
   для: Дрюсик   (19.05.2013 в 19:14)
 

where_id - это поле для каких целей предназначено?

  Ответить  
 
 автор: Дрюсик   (21.05.2013 в 14:39)   письмо автору
 
   для: cheops   (21.05.2013 в 08:11)
 

Здравствуйте, cheops!

Спасибо за ответы.

1) Да, решил воспользоваться стандартным partitional по id. Миллион записей на партицию.
2) Про messages и messages_text спасибо! Возвращаясь к 1 пункту хочу уточнить, партиции для двух таблиц делать лучше одинакового размера? Или для messages_text использовать более мелкие куски?
3) >>`cr_time` DATETIME NOT NULL, Замените на UNSIGNED INT, используйте UNIXSTAMP-метку.
Расскажите пожалуйста почему именно такое решение? Во всех проектах использую поле Date или datetime. Почему не стандартный механизм timestamp?
4) `from_id` - кто шлет, `where_id` - кому шлет.

  Ответить  
 
 автор: cheops   (21.05.2013 в 20:58)   письмо автору
 
   для: Дрюсик   (21.05.2013 в 14:39)
 

2. Пока разбейте одинаково, если будете пользоваться InnoDB в разбивке смысла не много, у InnoDB свой механизм разбивки табличного пространства.
3. Экономите 4 байта на запись, если записей очень много - экономите объем, чем меньше таблица - тем быстрее. Причем меньше не только данные, но индекс, а по дате индексировать придется. Всякие ситуации бывают иногда объем индексов сопоставим с объемом данных - искать в таком объеме не на многим эффективнее сканирования таблицы. Стандартный механизм TIMESTAMP переработали - он теперь использует такой же формат, что DATETIME, из особенностей автообновление при INSERT/UPDATE-запросах. Используйте только если вам действительно нужно обновление даты, при UPDATE-запросе (мне кажется не ваш случай). Кроме того, обновляется только один TIMESTAMP-столбец таблицы - первый. В общем довольно много подводных камней, которые постоянно нужно держать в голове. Я в последние годы никогда к TIMESTAMP не прибегал - слишком не прозрачно.

  Ответить  
 
 автор: Дрюсик   (22.05.2013 в 01:24)   письмо автору
 
   для: cheops   (21.05.2013 в 20:58)
 

Большое спасибо!
Последний пожалуй вопрос.
Как в текущую структуру бд добавить удаление сообщений?

У меня вариант добавить два флага удаления. 1 для автора сообщения. 2 для получателя.

Насколько правильное решение?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования