如果我们在一个也有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.
}
答案 0 :(得分:9)
LIMIT 1
肯定会对性能产生积极影响。而不是整个(好,取决于默认提取大小)数据集的数据集从数据库服务器返回到Java代码,只返回一行。这节省了大量的网络带宽和Java内存使用量。
始终尽可能多地将LIMIT
,ORDER
,WHERE
等约束委托给SQL语言,而不是在Java端进行。 DB会比你的Java代码做得更好(当然,如果表格被正确编入索引)。您应该尽可能多地编写SQL查询,以便它返回完全您需要的信息。
编写特定于DB的SQL查询的唯一缺点是SQL语言在不同的DB服务器之间不可完全移植,这需要您在更改数据库服务器时每次都更改SQL查询。但是,在现实世界中,切换到完全不同的DB make是非常罕见的。无论如何,将SQL字符串外部化为XML或属性文件应该会有很大的帮助。
答案 1 :(得分:1)
LIMIT可以通过两种方式加快速度:
其中第二个取决于MySQL如何产生排序。如果你没有关于manuDate的索引,那么MySQL必须从Cars获取所有行,然后对它们进行排序,然后给你第一个。但是如果manuDate上有索引,那么MySQL只能查看该索引中的第一个条目,获取相应的行,就是这样。 (如果索引还包含modelName,MySQL在查看索引后甚至不需要获取行 - 它是covering index。)
说了这么多,小心!如果manuDate不是唯一的,那么排序只是部分确定的(具有相同manuDate的所有行的顺序是未定义的),因此LIMIT 1没有一个正确的答案。例如,如果您切换存储引擎,您可能会开始得到不同的结果。