Большое сравнение - MySQL и PHP - PullRequest
0 голосов
/ 30 января 2010

Я разработал систему рейтинга пользователей, которая анализирует пользователей и сохраняет их информацию с оценкой в ​​дБ.

Я оцениваю и сохраняю около 1 миллиона пользователей.

У меня проблемы с тем, чтобы взять определенный набор пользователей из таблицы (оценка <50), а затем сравнить их идентификаторы с другим набором идентификаторов, при этом все не рухнет. </p>

Результат запроса (оценка <50) составляет около 65 тыс. Строк, и сравнение проводится, вероятно, с 1000 пользовательских идентификаторов, поэтому в целом выполняется 65 тыс. * 1000. </p>

Является ли мое узкое место в БД? Или это при сравнении идентификаторов? Есть ли лучший способ разделить это?

Запрос -> "выберите username, userscore из тех пользователей, где userscore <50" </p>

тогда

Foreach сравнивает значения

Ответы [ 2 ]

2 голосов
/ 30 января 2010

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

  • Убедитесь, что на userscore есть индекс. Если в вашей таблице более миллиона строк, и вы выполняете запрос с «WHERE userscore> 50», для этого столбца требуется индекс.
  • Убедитесь, что ваш запрос использует этот индекс. Запустите ваш запрос вручную с EXPLAIN на передней панели, т.е. EXPLAIN SELECT username, userscore from users where userscore < 50. Оптимизация результатов .
  • Вы не упомянули, как вы проводите сравнение идентификаторов, поэтому я предполагаю, что он находится в цикле, который проверяет каждый из них по массиву. Возможно, было бы лучше поместить все 1000 идентификаторов в запрос и ограничить ваш запрос SELECT пользователями со счетом <50 И с их идентификатором в этом наборе. </li>

Если вы опубликуете больше информации о ваших таблицах, индексах и сравнениях, я, вероятно, могу быть более конкретным.

0 голосов
/ 30 января 2010

кажется достаточно простым, чтобы ответить, если это дБ или нет. Непосредственно перед вашим запросом выполните создание файла журнала в / tmp. Затем запишите результаты microtime () в файл. Сразу после запроса напишите результаты другого microtime (). Запустите ваш скрипт один раз. Вы сможете увидеть следующее:

1) вы даже до места предварительного запроса

2) Сбой сценария в середине запроса

3) сколько времени занимает запрос, если он не завершился скриптом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...