【IT168 技术】在oracle数据库中,有一个变量绑定的用法,很多人都比较熟悉,可以调高数据库效率,应对高并发等,好吧,这其中并不包括我,当同事问我MySQL中有没有类似的写法时,我是很茫然的,于是就上网查,找到了如下一种写法:
DELIMITER $$set@stmt='select userid,username from myuser where userid between ? and ?';prepares1from@stmt;set@s1=2;set@s2=100;executes1 using@s1,@s2;deallocateprepares1;
$$
DELIMITER ;
用这种形式写的查询,可以随意替换参数,给出代码的人称之为预处理,我想这个应该就是MySQL中的变量绑定吧……但是,在查资料的过程中我却听到了两种声音,一种是,MySQL中有类似Oracle变量绑定的写法,但没有其实际作用,也就是只能方便编写,不能提高效率,这种说法在几个09年的帖子中看到:
另一种说法是MySQL中的变量绑定是能确实提高效率的,这个是希望有的,那到底有木有,还是自己去试验下吧。
试验是在本机进行的,数据量比较小,具体数字并不具有实际意义,但是,能用来说明一些问题,数据库版本是mysql-5.1.57-win32免安装版。
本着对数据库不是很熟悉的态度^_^,试验过程中走了不少弯路,此文以结论为主,就不列出实验的设计过程,文笔不好,文章写得有点枯燥,写出来是希望有人来拍砖,因为我得出的结论是:预处理在有没有cache的情况下的执行效率都不及直接执行…… 我对自己的实验结果不愿接受。。如果说预处理只为了规范下Query,使cache命中率提高的话个人觉得大材小用了,希望有比较了解的人能指出事实究竟是什么样子的——NewSilen
实验准备
第一个文件NormalQuery.sql
Setprofiling=1;
Select*FromMyTablewhereDictID=100601000004;
SelectDictIDfromMyTable limit1,100;
SelectDictIDfromMyTable limit2,100;
/*从limit 1,100 到limit 100,100 此处省略重复代码*/
......
SelectDictIDfromMyTable limit100,100;
SELECTquery_id,seq,STATE,10000*DURATIONFROMinformation_schema.profilingINTOOUTFILE'd:/NormalResults.csv'FIELDS TERMINATEDBY','LINES TERMINATEDBY'\n';
第二个sql文件 StmtQuery.sql
Setprofiling=1;Select*FromMyTablewhereDictID=100601000004;set@stmt='Select DictID from MyTable limit ?,?';prepares1from@stmt;set@s=100;set@s1=101;set@s2=102;
......set@s100=200;executes1 using@s1,@s;executes1 using@s2,@s;......executes1 using@s100,@s;SELECTquery_id,seq,STATE,10000*DURATIONFROMinformation_schema.profilingINTOOUTFILE'd:/StmtResults.csv'FIELDS TERMINATEDBY','LINES TERMINATEDBY'\n';