Does using Limit in query using JDBC, have any eff

2019-07-04 21:30发布

问题:

If we use the Limit clause in a query which also has ORDER BY clause and execute the query in JDBC, will there be any effect in performance? (using MySQL database)

Example:

     SELECT modelName from Cars ORDER BY manuDate DESC Limit 1

I read in one of the threads in this forum that, by default a set size is fetched at a time. How can I find the default fetch size?

I want only one record. Originally, I was using as follows:

SQL Query:

 SELECT modelName from Cars ORDER BY manuDate DESC

In the JAVA code, I was extracting as follows:

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

回答1:

Definitely the LIMIT 1 will have a positive effect on the performance. Instead of the entire (well, depends on default fetch size) data set of mathes being returned from the DB server to the Java code, only one row will be returned. This saves a lot of network bandwidth and Java memory usage.

Always delegate as much as possible constraints like LIMIT, ORDER, WHERE, etc to the SQL language instead of doing it in the Java side. The DB will do it much better than your Java code can ever do (if the table is properly indexed, of course). You should try to write the SQL query as much as possibe that it returns exactly the information you need.

Only disadvantage of writing DB-specific SQL queries is that the SQL language is not entirely portable among different DB servers, which would require you to change the SQL queries everytime when you change of DB server. But it's in real world very rare anyway to switch to a completely different DB make. Externalizing SQL strings to XML or properties files should help a lot anyway.



回答2:

There are two ways the LIMIT could speed things up:

  1. by producing less data, which means less data gets sent over the wire and processed by the JDBC client
  2. by potentially having MySQL itself look at fewer rows

The second one of those depends on how MySQL can produce the ordering. If you don't have an index on manuDate, MySQL will have to fetch all the rows from Cars, then order them, then give you the first one. But if there's an index on manuDate, MySQL can just look at the first entry in that index, fetch the appropriate row, and that's it. (If the index also contains modelName, MySQL doesn't even need to fetch the row after it looks at the index -- it's a covering index.)

With all that said, watch out! If manuDate isn't unique, the ordering is only partially deterministic (the order for all rows with the same manuDate is undefined), and your LIMIT 1 therefore doesn't have a single correct answer. For instance, if you switch storage engines, you might start getting different results.



标签: java jdbc