使用JDBC在查询中使用Limit会对性能产生任何影响吗?

时间:2011-12-20 16:38:54

标签: java jdbc

如果我们在一个也有ORDER BY子句的查询中使用Limit子句并在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 个答案:

答案 0 :(得分:9)

LIMIT 1肯定会对性能产生积极影响。而不是整个(好,取决于默认提取大小)数据集的数据集从数据库服务器返回到Java代码,只返回一行。这节省了大量的网络带宽和Java内存使用量。

始终尽可能多地将LIMITORDERWHERE等约束委托给SQL语言,而不是在Java端进行。 DB会比你的Java代码做得更好(当然,如果表格被正确编入索引)。您应该尽可能多地编写SQL查询,以便它返回完全您需要的信息。

编写特定于DB的SQL查询的唯一缺点是SQL语言在不同的DB服务器之间不可完全移植,这需要您在更改数据库服务器时每次都更改SQL查询。但是,在现实世界中,切换到完全不同的DB make是非常罕见的。无论如何,将SQL字符串外部化为XML或属性文件应该会有很大的帮助。

答案 1 :(得分:1)

LIMIT可以通过两种方式加快速度:

  1. 通过生成更少的数据,这意味着更少的数据通过线路发送并由JDBC客户端处理
  2. 可能让MySQL自己查看更少的行
  3. 其中第二个取决于MySQL如何产生排序。如果你没有关于manuDate的索引,那么MySQL必须从Cars获取所有行,然后对它们进行排序,然后给你第一个。但是如果manuDate上有索引,那么MySQL只能查看该索引中的第一个条目,获取相应的行,就是这样。 (如果索引还包含modelName,MySQL在查看索引后甚至不需要获取行 - 它是covering index。)

    说了这么多,小心!如果manuDate不是唯一的,那么排序只是部分确定的(具有相同manuDate的所有行的顺序是未定义的),因此LIMIT 1没有一个正确的答案。例如,如果您切换存储引擎,您可能会开始得到不同的结果。