2010-12-16 2 views
2

Почему очень простой скрипт, который вставляет 26 000 записей в базу данных mysql (myisam, без транзакций), занимает 13 секунд в реализации php, а затем 35-50 секунд с использованием моно + mysql-коннектора?mono + mysql = slow?

Я думал, что asp.net был быстрее, чем php? Может ли проблема быть моно-mysql-коннектором «независимой от платформы», поэтому производительность просто воняет? или asp.net страдает больше накладных расходов, чем php, когда дело доходит до выполнения каждого запроса?

Нет ли встроенных бинарных файлов linux для соединителя mysql для моно, что может быть быстрее?

+0

Возможно, PHP прозрачно перерабатывает соединения, а моно открывает и закрывает новое соединение для каждой строки? – Asaph 2010-12-16 15:50:34

+2

Непосредственно решить проблему, но если вы делаете одну строку для каждой вставки, вы можете переписать ее, чтобы вставить несколько строк с одним утверждением - это может помочь бит с вставками большого объема (см. `INSERT INTO sometable (col1, col2 , col3) VALUES (val11, val12, val13), (val21, val22, val23) `): http://dev.mysql.com/doc/refman/5.1/en/insert.html – Piskvor 2010-12-16 15:52:01

ответ

2

Вместо 52 000 запросов на вставку/обновление я теперь использую StringBuilder (инициализированный размером 1 МБ), чтобы построить один длинный запрос «заменить на». Теперь это займет всего 3 секунды (на обоих окнах/.net и linux/mono) вместо 35 + секунд :-)

Спасибо Piskvor.

Сноска: Я просто упростил PHP-скрипт, чтобы сделать то же самое (создать гигантский запрос «заменить в»), и он по-прежнему занимает 13 секунд против 3-го числа asp.net!

Таким образом, он выглядит как .NET быстрее на более базовом уровне (по крайней мере, в тех случаях, когда манипулирует строкой) и работает только медленнее при запуске многих запросов из-за субоптимального .net-соединения mysql.