MySQL против веб-сервера для обработки данных - PullRequest
3 голосов
/ 05 июня 2009

Мне было интересно, быстрее ли обрабатывать данные в MySQL или на языке сервера, таком как PHP или Python. Я уверен, что нативные функции, такие как ORDER, будут быстрее в MySQL из-за индексации, кэширования и т. Д., Но на самом деле вычисляют ранг (включая связи, возвращающие несколько записей с одинаковым рангом):

Пример SQL

SELECT TORCH_ID,
    distance AS thisscore,
    (SELECT COUNT(distinct(distance))+1 FROM torch_info WHERE distance > thisscore) AS rank
    FROM torch_info ORDER BY rank

Сервер

... в отличие от простого выполнения SELECT TORCH_ID FROM torch_info ORDER BY score DESC и последующего определения рейтинга PHP на веб-сервере.

Ответы [ 6 ]

2 голосов
/ 06 июня 2009

В общем случае ответ на вопрос «Должен ли я обрабатывать данные в базе данных или на вопрос веб-сервера» звучит так: «Это зависит».

  1. Легко добавить еще один веб-сервер. Труднее добавить еще один сервер базы данных. Если вы можете снять нагрузку с базы данных, это может быть хорошо.
  2. Если выходные данные вашей обработки данных намного меньше, чем требуемые входные данные, вы можете избежать больших затрат на передачу данных, выполнив обработку в базе данных. В качестве простого примера было бы глупо SELECT * извлекать каждую строку в таблице и повторять их на веб-сервере, чтобы выбрать ту, где х = 3, когда вы можете просто SELECT * WHERE x = 3
  3. Как вы указали, база данных оптимизирована для работы с данными, использования индексов и т. Д.
1 голос
/ 05 июня 2009

MySQL, вероятно, будет быстрее с большинством несложных вычислений. Тем не менее, 90% времени сервер баз данных является узким местом, так что вы действительно хотите добавить к этому, увязнув базу данных с этими вычислениями? Я сам предпочел бы разместить их на веб-сервере / сервере приложений, чтобы выровнять нагрузку, но это ваше решение.

1 голос
/ 05 июня 2009

Скорость подсчета будет зависеть от используемого вами механизма хранения БД и размера таблицы. Хотя я подозреваю, что почти все подсчеты и ранги, выполняемые в mySQL, будут быстрее, чем извлечение этих же данных в память PHP и выполнение одной и той же операции.

0 голосов
/ 05 июня 2009

Если ваш тест выполняет отдельные запросы вместо публикации транзакций, я бы порекомендовал использовать драйвер JDBC поверх ODBC dsn, потому что вы получите производительность в 2-3 раза быстрее. (я предполагаю, что вы используете odbc dsn здесь в ваших тестах)

0 голосов
/ 05 июня 2009

Большая часть вашего вопроса зависит от настроенных вами первичных ключей и индексов. Предполагая, что torchID проиндексирован правильно ...

Вы обнаружите, что mySQL быстрее, чем код на стороне сервера.

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

Допустим, у вас есть 10 000 записей, 1000 пользователей, которые нажимают этот запрос один раз в день, и 100 пользователей, которые вносят новый отчет каждый день. Я бы предпочел, чтобы БД делала 100 обновлений, в которых 10% из них попадали в каждую запись (9 999), а затем ранжировался запрос ранжирования 1000 раз в день.

Мои два цента.

0 голосов
/ 05 июня 2009

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

...