復制代碼 代碼如下:
 
DELIMITER $$ 
set @stmt = 'select userid,username from myuser where userid between ? and ?'; 
prepare s1 from @stmt; 
set @s1 = 2; 
set @s2 = 100; 
execute s1 using @s1,@s2; 
deallocate prepare s1; 
$$ 
DELIMITER ; 
復制代碼 代碼如下:
 
Set profiling=1; 
Select * From MyTable where DictID = 100601000004; 
Select DictID from MyTable limit 1,100; 
Select DictID from MyTable limit 2,100; 
/*從limit 1,100 到limit 100,100 此處省略重復代碼*/ 
...... 
Select DictID from MyTable limit 100,100; 
SELECT query_id,seq,STATE,10000*DURATION FROM information_schema.profiling INTO OUTFILE 'd:/NormalResults.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '/n'; 
復制代碼 代碼如下:
 
Set profiling=1; 
Select * From MyTable where DictID = 100601000004; 
set @stmt = 'Select DictID from MyTable limit ?,?'; 
prepare s1 from @stmt; 
set @s = 100; 
set @s1 = 101; 
set @s2 = 102; 
...... 
set @s100 =200; 
execute s1 using @s1,@s; 
execute s1 using @s2,@s; 
...... 
execute s1 using @s100,@s; 
SELECT query_id,seq,STATE,10000*DURATION FROM information_schema.profiling INTO OUTFILE 'd:/StmtResults.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '/n'; 
從結果中可以看出,無論是先執行還是后執行,NormalQuery中的語句都比使用預處理語句的要快一些=.=!
那再來看看每一句查詢具體的情況,Normal和Stmt的query各執行了兩百次,每一步的詳細信息如下:

從這里面可以看出,第一個,normalquery比stmtquery少一個步驟,第二個,雖然stmt在不少步驟上是優于normal的,但在executing一步上輸掉太多,最后結果上也是落敗
最后,再給出一個查詢緩存的實驗結果,具體步驟就不列了

在查詢緩存的時候,Normal完勝……
寫在最后
大概情況就是這樣,我回憶了一下,網上說預處理可以提高效率的,基本都是用編程的方式去執行查詢,不知道這個有沒有關系,基礎有限,希望園子里的大牛能看到,幫忙解惑
實驗結果附件 
MySQL預處理實驗結果
新聞熱點
疑難解答