Я настроил 3 машины, подключенные к маршрутизатору (через WI-FI). У меня установлен сервер MySQL на Core I7 Machine с хорошим объемом памяти. и запрашиваю с других машин, чтобы получить данные с сервера.

В таблице с 100000+ записей запрос выполняется на сервере за 0,4 секунды, однако на клиентском компьютере этот запрос занимает почти 3 секунды.

Что мне не хватает? Почему выполнение одного и того же запроса (select * from tableName) занимает так много времени, когда выполняется с клиентского компьютера.

Спасибо за комментарии. Я проверил один и тот же запрос на обеих машинах, установив ограничение в 10 строк. Потребляемое время составляет менее 0,01 мс. Таким образом, для более коротких наборов данных время встроено, однако при запросе полных таблиц существует значительная разница во времени.

Моя теоретическая скорость сети составляет 150 Мбит / с, но запросы все еще занимают много времени. Любые предложения о том, как это можно улучшить? Наличие переключателя и подключение всех машин для переключения? это решит проблему?

На сервере и на клиенте не выполняется никаких других процессов. Я закрыл все приложения и пытаюсь отладить проблему с медлительностью. Заранее спасибо.

2 ответа2

0

Чего не хватает, так это того, как вы запрашиваете БД ... например, неизвестный клиент "извлекает" все данные с сервера [и, возможно, блокирует таблицу, как это делает], а затем отображает результаты - vs- сервер только предоставляя необходимые данные [и не блокируя таблицу, или блокируя только внутреннюю часть запроса сервера].

Что касается как блокировки, так и количества "извлеченных" данных ... это зависит от того, как вы выполняете запрос ... в отношении блокировки, это зависит от настроек по умолчанию; потому что в некоторых случаях даже для запроса select может потребоваться блокировка таблиц, чтобы обеспечить правильную агрегацию при длительных запросах ... Кроме того, когда вы говорите "JOIN", это "соединение" в локальной клиентской памяти или на сервере? Есть бизнес-кейс для обоих. Обычно в таких случаях, как ваш (где используются большие объемы данных), это идеальный случай для SPROC и UDF (пользовательских функций). Вы пытались создать SPROC и UDF? (только возвращая результат и / или статус.)

Я бы попытался запустить хранимую процедуру (которая внутренне имеет тот же SQL, что и "ручной" SQL клиента) с удаленного ПК и посмотреть, есть ли у вас такая задержка.

Если это не решает проблему, тогда вам действительно необходимо включить более конкретные сведения не только о запросе, но и о том, какой "стек" вы используете для запроса на удаленном ПК.

0

select * from tableName - очень расплывчатый запрос (получить ВСЕ данные из таблицы). Если таблица имеет длину более 100000 строк, то сервер, вероятно, возвращает много данных. Если общий размер возвращаемых данных велик, то передача их на удаленную машину займет значительно больше времени, чем просто выгрузка их на локальный сервер.

Попробуйте повысить точность ваших запросов, чтобы они возвращали меньше данных. То есть, если вам нужны только "Имя" и "Адрес" из таблицы, попробуйте что-то вроде « Select Name,Address from tableName чтобы вы также не получили кучу полей / данных, которые вы не собираетесь использовать.

Другой (единственный) способ значительно ускорить его - увеличить скорость сетевого соединения между сервером и клиентом (-ами).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .