zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

使用Limit参数优化MySQL查询的方法

mysql方法 使用 查询 优化 参数 limit
2023-06-13 09:14:06 时间

前些天看了一个老外写的程序,在MySQL查询中使用了很多Limit关键字,这就让我很感兴趣了,因为在我印象中,Limit关键字似乎更多被使用MySQL数据库的程序员用来做查询分页(当然这也是一种很好的查询优化),那在这里举个例子,假设我们需要一个分页的查询,Oracle中一般来说都是用以下SQL句子实现:
SELECT*FROM
(SELECTa1.*,rownumrownum_
FROMtesttablea1
WHERErownum>20)
WHERErownum_<=1000
这个语句就能查询到testtable表中的20到1000记录,而且还需要嵌套查询,效率不会太高,看看MySQL的实现:
SELECT*FROMtesttablea1limit20,980;
这样就能返回testtable表中的21条到(20+980=)1000条的记录。
实现语法确实简单,但如果要说这里两个SQL语句的效率,那就很难做比较了,因为在MySQL中Limit选项有多种不同的解释方式,不同方式下的速度差异是很大的,因此我们不能从这语句的简洁程度就说谁的效率高。
不过对程序员来说,够简单就好,因为维护成本低,呵呵。
下面讲讲这个Limit的语法吧:
SELECT…….--Select语句的其他参数
[LIMIT{[offset,]row_count|row_countOFFSEToffset}]
这里offset是偏移量(这个偏移量的起始地址是0,而不是1,这点很容易搞错的)顾名思义就是离开起始点的位置,而row-count也是很简单的,就是返回的记录的数量限制。
Eg.SELECT*FROMtesttablealimit10,20where….
这样就能使结果返回10行以后(包括10行自身)的符合where条件的20条记录。
那么如果没有约束条件就返回10到29行的记录。
那这跟避免全表扫描有什么关系呢?下面是MySQL手册对Limit参数优化扫描的一些说明:
在一些情况中,当你使用LIMIT选项而不是使用HAVING时,MySQL将以不同方式处理查询。
l如果你用LIMIT只选择其中一部分行,当MySQL一般会做完整的表扫描时,但在某些情况下会使用索引(跟ipart有关)。
l如果你将LIMITn与ORDERBY同时使用,在MySQL找到了第一个符合条件的记录后,将结束排序而不是排序整个表。
l当LIMITn和DISTINCT同时使用时,MySQL在找到一个记录后将停止查询。
l某些情况下,GROUPBY能通过顺序读取键(或在键上做排序)来解决,并然后计算摘要直到键值改变。在这种情况下,LIMITn将不计算任何不必要的GROUP。
l当MySQL完成发送第n行到客户端,它将放弃余下的查询。
l而LIMIT0选项总是快速返回一个空记录。这对检查查询并且得到结果列的列类型是有用的。
l临时表的大小使用LIMIT#计算需要多少空间来解决查询。