Intereting Posts
Установка Magento 2.0.2 на общий сервер – застрял на 66% Создание правильного захвата изображения текущего экрана с использованием jquery или PHP или конвертировать div в pdf vBulletin как логин для всего веб-сайта (изменить: определенный прогресс был достигнут) Каков наилучший способ получить последний элемент массива без его удаления? PHP из памяти – сбой Apache? Представление PHP + jQuery + Ajax – результаты возврата на той же странице Медленная выборка содержимого из URL-адреса PHP – введите дату в mysql Zend Framework: определение того, какой контроллер или страница, на которой вы используете / находитесь Производительность MySQL – несколько запросов или один неэффективный запрос? как проверить, включен ли завиток или отключен Поле $ _FILES 'tmp_name' не имеет значения для расширения файла .JPG PHP: Какой самый быстрый способ запросить MySQL? Поскольку PDO болезненно медленный Сбор значений столбцов в массив Правильный способ управления сеансами в PHP?

Проектирование баз данных для голосовых кнопок

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

Прежде всего, вот моя таблица для голосования:

  1. voteId —– AUTO_INCREMENT с PRIMARY KEY.
  2. mediaId —- Медиа, для которого пользователь дает голосование вверх / вниз.
  3. userId —– Пользователь, который голосовал.
  4. voteMode — 1 для Up Vote и 0 для Down Vote. Это целое поле.

В этом случае, если у меня есть 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 . Это может помочь вам решить, какой двигатель вы должны использовать.

И некоторые другие хаки, которые могут вам помочь:

  1. Кэш запросов MySQL
  2. Подготовленные заявления в php
  3. РАЗМЕЩЕНИЕ КОЛОННЫ

Некоторые ресурсы по оптимизации баз данных MySql:

  1. Настройка MySQL
  2. Оптимизация Mysql
  3. Масштабируемость в реальном мире MySQL .

Хорошо, две вещи. 15k записей ничего, что вряд ли может дать проблему. Я использую таблицы с 150-миллиметровыми строками, и запросы по-прежнему хорошо работают под .005s

  1. Я подозреваю, что вы используете MyIsam, а не InnoDB. В MyIsam каждая вставка (или обновление) блокирует всю таблицу. Поэтому, пока кто-то голосует, таблицы заблокированы, а другие не могут читать. Это может стать проблемой, если у вас тысячи пользователей.

  2. Убедитесь, что у вас есть нужные индексы. Я не уверен, что запросы медленные (и как медленно!), Но убедитесь, что у вас есть индекс в столбцах, которые вы ищете (возможно, mediaId).

Если вы хотите лучше посоветуете, опубликуйте медленные запросы.

Если вы хотите отслеживать, какой пользователь голосовал за x media, и каждый пользователь голосует, то ваша минимальная сумма данных – это users * media .

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