Я работаю над проектом, в котором у меня есть параметры голосования вверх и вниз, похожие на StackOverFlow. Я не очень много разбираюсь в разработке БД, и поэтому я встал со следующей проблемой,
Прежде всего, вот моя таблица для голосования:
В этом случае, если у меня есть 100 пользователей и 100 медиа, то у меня будет 100×100 записей всего всего в этой таблице.
Проблема возникает здесь, когда БД встает с большим количеством записей, и кнопка голосования мертва медленно реагировать сейчас. Это делает моего клиента несчастным и меня в беде.
Может ли кто-нибудь предложить мне лучшую модель, чтобы избежать этой огромной таблицы?
Я использую jQuery.ajax, чтобы опубликовать свой голос на сервере. Кроме того, проект основан на PHP и Zend Framework 1.11 . Поэтому, когда я нажимаю значок «ВВЕРХ», потребуется некоторое время, чтобы ответить. Некоторое время Mozilla использовала Crash. Я тестировал с вставкой через цикл с множеством мусорных записей (около 15000) .
Вы можете попробовать эту градацию схемы таблиц:
//All id's are now unsigned , As you do not need any sign ALTER TABLE `voting` CHANGE `voteid` `voteid` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, CHANGE `mediaId` `mediaId` INT(11) UNSIGNED NOT NULL, CHANGE `userId` `userId` INT(11) UNSIGNED NOT NULL, //ENUM datatype as you need only 2 type of value CHANGE `voteMode` `voteMode` ENUM('1' , '2') NOT NULL ; //Adding index , it will surely increase some speed //Do **not use** index in **columns you do not need** ALTER TABLE `voting` ADD INDEX ( `mediaId` , `userId` ) ;
Пройдите через индекс Mysql, чтобы узнать больше об индексации.
Если вы используете MyISAM Storage Engine , то я предлагаю вам перейти на InnoDB Storage Engine . Это может помочь вам решить, какой двигатель вы должны использовать.
И некоторые другие хаки, которые могут вам помочь:
Некоторые ресурсы по оптимизации баз данных MySql:
Хорошо, две вещи. 15k записей ничего, что вряд ли может дать проблему. Я использую таблицы с 150-миллиметровыми строками, и запросы по-прежнему хорошо работают под .005s
Я подозреваю, что вы используете MyIsam, а не InnoDB. В MyIsam каждая вставка (или обновление) блокирует всю таблицу. Поэтому, пока кто-то голосует, таблицы заблокированы, а другие не могут читать. Это может стать проблемой, если у вас тысячи пользователей.
Убедитесь, что у вас есть нужные индексы. Я не уверен, что запросы медленные (и как медленно!), Но убедитесь, что у вас есть индекс в столбцах, которые вы ищете (возможно, mediaId).
Если вы хотите лучше посоветуете, опубликуйте медленные запросы.
Если вы хотите отслеживать, какой пользователь голосовал за x media, и каждый пользователь голосует, то ваша минимальная сумма данных – это users * media
.
Если вы хотите иметь меньше данных, вам нужно сделать концессию. Возможно, пользователь может зарегистрироваться и проголосовать анонимно? Большинство пользователей не очень счастливы, если личные предпочтения могут быть отстранены от голосования.