Влияет ли использование Limit в запросе с использованием JDBC на производительность? - PullRequest
3 голосов
/ 20 декабря 2011

Если мы используем предложение Limit в запросе, который также имеет предложение ORDER BY, и выполняем запрос в JDBC, будет ли какой-либо эффект на производительность? (используя базу данных MySQL)

Пример:

     SELECT modelName from Cars ORDER BY manuDate DESC Limit 1

Я прочитал в одной из тем на этом форуме, что по умолчанию выбранный размер выбирается за раз. Как найти размер выборки по умолчанию?

Я хочу только одну запись. Первоначально я использовал следующее:

SQL-запрос:

 SELECT modelName from Cars ORDER BY manuDate DESC

В коде JAVA я извлекал следующее:

  if(resultSett.next()){
      //do something here.
  }

Ответы [ 2 ]

9 голосов
/ 20 декабря 2011

Определенно, LIMIT 1 окажет положительное влияние на производительность.Вместо набора целых (что зависит от размера выборки по умолчанию), из набора соответствий, возвращаемых с сервера БД в код Java, будет возвращена только одна строка.Это экономит большую пропускную способность сети и использование памяти Java.

Всегда делегируйте как можно больше ограничений, таких как LIMIT, ORDER, WHERE и т. Д., На язык SQL, а не на стороне Java.БД сделает это намного лучше, чем ваш код Java (если таблица, конечно, правильно проиндексирована).Вы должны попытаться написать запрос SQL настолько, насколько это возможно, чтобы он возвращал в точности необходимую вам информацию.

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

1 голос
/ 20 декабря 2011

Существует два способа, с помощью которых LIMIT может ускорить процесс:

  1. , производя меньше данных, что означает, что меньше данных отправляется по проводам и обрабатывается клиентом JDBC
  2. потенциально сам MySQL просматривает меньшее количество строк

Второй из них зависит от того, как MySQL может производить упорядочение.Если у вас нет индекса для manuDate, MySQL должен будет извлечь все строки из Cars, затем упорядочить их, а затем дать вам первый.Но если есть индекс для manuDate, MySQL может просто просмотреть первую запись в этом индексе, извлечь соответствующую строку, и все.(Если индекс также содержит modelName, MySQL даже не нужно извлекать строку после того, как он смотрит на индекс - это охватывающий индекс .)

После всего сказанного смотритеиз!Если manuDate не является уникальным, порядок является только частично детерминированным (порядок для всех строк с одинаковым значением manuDate не определен), и поэтому ваш LIMIT 1 не имеет единственного правильного ответа.Например, если вы переключите механизмы хранения, вы можете начать получать другие результаты.

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