亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL中Stmt 預處理提高效率問題的小研究

 更新時間:2011年08月14日 23:16:02   作者:  
在oracle數(shù)據(jù)庫中,有一個變量綁定的用法,很多人都比較熟悉,可以調高數(shù)據(jù)庫效率,應對高并發(fā)等,好吧,這其中并不包括我,當同事問我MySQL中有沒有類似的寫法時,我是很茫然的,于是就上網(wǎng)查,找到了如下一種寫法
復制代碼 代碼如下:

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 ;

用這種形式寫的查詢,可以隨意替換參數(shù),給出代碼的人稱之為預處理,我想這個應該就是MySQL中的變量綁定吧……但是,在查資料的過程中我卻聽到了兩種聲音,一種是,MySQL中有類似Oracle變量綁定的寫法,但沒有其實際作用,也就是只能方便編寫,不能提高效率,這種說法在幾個09年的帖子中看到:
http://www.itpub.net/thread-1210292-1-1.html
http://cuda.itpub.net/redirect.php?fid=73&tid=1210572&goto=nextnewset
另一種說法是MySQL中的變量綁定是能確實提高效率的,這個是希望有的,那到底有木有,還是自己去試驗下吧。
試驗是在本機進行的,數(shù)據(jù)量比較小,具體數(shù)字并不具有實際意義,但是,能用來說明一些問題,數(shù)據(jù)庫版本是mysql-5.1.57-win32免安裝版。
  本著對數(shù)據(jù)庫不是很熟悉的態(tài)度^_^,試驗過程中走了不少彎路,此文以結論為主,就不列出實驗的設計過程,文筆不好,文章寫得有點枯燥,寫出來是希望有人來拍磚,因為我得出的結論是:預處理在有沒有cache的情況下的執(zhí)行效率都不及直接執(zhí)行…… 我對自己的實驗結果不愿接受。。如果說預處理只為了規(guī)范下Query,使cache命中率提高的話個人覺得大材小用了,希望有比較了解的人能指出事實究竟是什么樣子的——NewSilen
實驗準備
  第一個文件NormalQuery.sql
復制代碼 代碼如下:

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';

第二個sql文件 StmtQuery.sql
復制代碼 代碼如下:

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';

做幾點小說明:
1. Set profiling=1; 執(zhí)行此語句之后,可以從information_schema.profiling這張表中讀出語句執(zhí)行的詳細信息,其實包含不少內容,包括我需要的時間信息,這是張臨時表,每新開一個會話都要重新設置profiling屬性才能從這張表中讀取數(shù)據(jù)
2. Select * From MyTable where DictID = 100601000004;
  這行代碼貌似和我們的實驗沒什么關系,本來我也是這么認為的,之所以加這句,是我在之前的摸索中發(fā)現(xiàn),執(zhí)行過程中有個步驟是open table,如果是第一次打開某張表,那時間是相當長的,所以在執(zhí)行后面的語句前,我先執(zhí)行了這行代碼打開試驗用的表
3. MySQL默認在information_schema.profiling表中保存的查詢歷史是15條,可以修改profiling_history_size屬性來進行調整,我希望他大一些讓我能一次取出足夠的數(shù)據(jù),不過最大值只有100,盡管我調整為150,最后能夠查到的也只有100條,不過也夠了
4. SQL代碼我沒有全列出來,因為查詢語句差不多,上面代碼中用省略號表示了,最后的結果是兩個csv文件,個人習慣,你也可以把結果存到數(shù)據(jù)庫進行分析
  實驗步驟
重啟數(shù)據(jù)庫,執(zhí)行文件NormalQuery.sql,執(zhí)行文件StmtQuery.sql,得到兩個結果文件
再重啟數(shù)據(jù)庫,執(zhí)行StmtQuery.sql,執(zhí)行文件NormalQuery.sql,得到另外兩個結果文件
  實驗結果
詳細結果在最后提供了附件下載,有興趣的朋友可以看下
  結果分析
每一個SQL文件中執(zhí)行了一百個查詢語句,沒有重復的查詢語句,不存在查詢cache,統(tǒng)計執(zhí)行SQL的平均時間得出如下結果

從結果中可以看出,無論是先執(zhí)行還是后執(zhí)行,NormalQuery中的語句都比使用預處理語句的要快一些=.=!

那再來看看每一句查詢具體的情況,Normal和Stmt的query各執(zhí)行了兩百次,每一步的詳細信息如下:

從這里面可以看出,第一個,normalquery比stmtquery少一個步驟,第二個,雖然stmt在不少步驟上是優(yōu)于normal的,但在executing一步上輸?shù)籼?,最后結果上也是落敗

 最后,再給出一個查詢緩存的實驗結果,具體步驟就不列了

在查詢緩存的時候,Normal完勝……

寫在最后

大概情況就是這樣,我回憶了一下,網(wǎng)上說預處理可以提高效率的,基本都是用編程的方式去執(zhí)行查詢,不知道這個有沒有關系,基礎有限,希望園子里的大牛能看到,幫忙解惑
實驗結果附件

MySQL預處理實驗結果

相關文章

  • MySQL常見優(yōu)化方案匯總

    MySQL常見優(yōu)化方案匯總

    mysql數(shù)據(jù)庫是中小微企業(yè)常用的一種數(shù)據(jù)化管理工具,它具有輕便,簡潔,免費等特點。今天通過本文給大家介紹MySQL常見優(yōu)化方案匯總,感興趣的朋友一起看看吧
    2022-01-01
  • mysql installer web community 5.7.21.0.msi安裝圖文教程

    mysql installer web community 5.7.21.0.msi安裝圖文教程

    這篇文章主要為大家詳細介紹了mysql installer web community 5.7.21.0.msi,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • mysql 列轉行的技巧(分享)

    mysql 列轉行的技巧(分享)

    下面小編就為大家?guī)硪黄猰ysql 列轉行的技巧(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • MySQL配置文件my.cnf參數(shù)優(yōu)化和中文詳解

    MySQL配置文件my.cnf參數(shù)優(yōu)化和中文詳解

    這篇文章主要介紹了MySQL配置文件my.cnf參數(shù)優(yōu)化和中文詳解,非常詳細的用中文注釋了各個參數(shù)的作用以及建議值,需要的朋友可以參考下
    2014-03-03
  • 定時備份mysql, 定時切割nginx access log的方法

    定時備份mysql, 定時切割nginx access log的方法

    定時備份mysql, 定時切割nginx access log的方法,需要的朋友可以參考下。
    2011-09-09
  • MySql開發(fā)之自動同步表結構

    MySql開發(fā)之自動同步表結構

    這篇文章主要給大家介紹了關于MySql開發(fā)之自動同步表結構的相關資料,這樣可以避免在開發(fā)中由于修改數(shù)據(jù)庫字段導致的數(shù)據(jù)庫表不一致問題,需要的朋友可以參考下
    2021-05-05
  • 解決myBatis中刪除條件的拼接問題

    解決myBatis中刪除條件的拼接問題

    這篇文章主要介紹了解決myBatis中刪除條件的拼接問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • MySQL 5.6主從報錯的實戰(zhàn)記錄

    MySQL 5.6主從報錯的實戰(zhàn)記錄

    這篇文章主要給大家介紹了關于MySQL 5.6主從報錯的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • mysql連接查詢、聯(lián)合查詢、子查詢原理與用法實例詳解

    mysql連接查詢、聯(lián)合查詢、子查詢原理與用法實例詳解

    這篇文章主要介紹了mysql連接查詢、聯(lián)合查詢、子查詢原理與用法,結合實例形式詳細分析了mysql連接查詢、聯(lián)合查詢、子查詢的基本概念、功能、原理、用法及操作注意事項,需要的朋友可以參考下
    2020-04-04
  • 一篇文章搞懂MySQL加鎖機制

    一篇文章搞懂MySQL加鎖機制

    線程安全就是多線程訪問時,采用了加鎖機制,當一個線程訪問該類的某個數(shù)據(jù)時進行保護,下面這篇文章主要給大家介紹了關于MySQL加鎖機制的相關資料,需要的朋友可以參考下
    2022-01-01

最新評論