Home > Database > Mysql Tutorial > 实践证明在数据库中使用游标效果会更好_MySQL

实践证明在数据库中使用游标效果会更好_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Release: 2016-06-01 14:00:42
Original
889 people have browsed it

在数据库中有两个表,一个比较巨大,大约1千万条记录(表Big),另一个只有5000条(表small)。

目前需要根据表small来更新表Big。

UPDATE Big SET Bf1=0 WHERE BigId IN(SELECT BigId FROM Small WHERE Sf1>0)

但是这样执行下来,速度非常慢,并且连接使用这台DB服务器的程序也都慢了下来,几近不可用。

仔细分析这条SQL语句,使用了IN。有人说IN是会分拆成一个个OR表达式的,而OR语句将不会使用索引,所以有时候遇到OR,会用UNION ALL来代替。

但在这里用UNION ALL是不行的。

根据笔者的猜想,这条SQL语句大概会用上全表搜索,大表1千万条记录,那么至少比较1千万次,怎么会不慢呢。

于是选择改用游标,先将小表的记录提取出来,然后一条条的跟大表结合执行。


DECLARE curT CURSOR FOR SELECT BigId FROM Small WHERE Sf1>0; DECLARE @Id INT; OPEN curT; FETCH NEXT FROM curT INTO @Id; WHILE @@FETCH_STATUS = 0 BEGIN UPDATE Big SET Bf1=0 WHERE BigId=@BigId; FETCH NEXT FROM curT INTO @Id; END CLOSE curT; DEALLOCATE curT;
 

这样游标里的记录数量最多也只会有5000条,BidId在大表里又有索引,分成5000次执行,虽然在连接编译时花了一些时间,但与恐怖的巨大表全表搜索比较,是微乎其微。

实践证明,上面的语句在大约4分钟执行完毕,在此期间使用此数据库的应用程序不受影响,速度同样很快

Related labels:
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Issues
Update one column of data in the table
From 1970-01-01 08:00:00
0
0
0
Optimize table indexes in MySQL
From 1970-01-01 08:00:00
0
0
0
Why can't the list be rendered?
From 1970-01-01 08:00:00
0
0
0
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template