mysql直接執行和預處理執行的效率比較

2021-06-03 10:31:51 字數 4247 閱讀 5689

最近閒來無事,想看看mysql預處理執行效率和直接執行的效率差別有多大。先去網上查了查,兩種聲音都有,沒辦法,只好自己來驗證驗證。

我打算測試插入的效率,下來建乙個表

create

table

`test` (

`id`int(11

notnull

auto_increment,

`col1`varchar(64

notnull

default'',

`col2`char(60

default

null

,`col3` blob,

`col4`timestamp

null

default

null

,primary

key(`id`)

) engine

=myisam 

default

charset

=utf8;

接下來貼上兩段分別用預處理插入的語句和直接插入的語句 

預處理**

bool

insert()

//測試mysql_stmt_field_count()作用

//printf("mysql_stmt_field_count return value[%d]\r\n",mysql_stmt_field_count(stmt));

mysql_bind    bind[4];

unsigned 

long

length[4];

my_bool       is_null[4];

memset(bind,0,

sizeof

(bind));

memset(length,0,

sizeof

(length));

memset(is_null,0,

sizeof

(is_null));

char

varchar_var[string_size] ="

hello yg";

char

char_var[string_size] ="

hello dl";

struct

st_stud st;

st.id =1

;strncpy(st.name,

"shine.yang",

16);

st.score 

=10.0f

;time_t cur_t 

=time(null);

struct

tm cur_tm;

localtime_r(

&cur_t,

&cur_tm);

mysql_time    ts;

ts.year 

=cur_tm.tm_year

+1900

, ts.month 

=cur_tm.tm_mon+1

, ts.day 

=cur_tm.tm_mday,ts.hour 

=cur_tm.tm_hour, ts.minute 

=cur_tm.tm_min, ts.second 

=cur_tm.tm_sec;

bind[

0].buffer_type

=mysql_type_string;

bind[

0].buffer

=varchar_var;

bind[

0].buffer_length 

=string_size;

length[0] 

=strlen(varchar_var);

bind[

0].length =&

length[0];

bind[

0].is_null=&

is_null[0];

bind[

1].buffer_type

=mysql_type_string;

bind[

1].buffer

=char_var;

bind[

1].buffer_length 

=string_size;

length[1] 

=strlen(char_var);

bind[

1].length =&

length[1];

bind[

1].is_null=&

is_null[1];

bind[

2].buffer_type

=mysql_type_blob;

bind[

2].buffer=(

char*)

&st;

bind[

2].buffer_length 

=sizeof

(st);

length[2] 

=sizeof

(st);

bind[

2].length =&

length[2];

bind[

2].is_null=&

is_null[2];

bind[

3].buffer_type 

=mysql_type_timestamp;

bind[

3].buffer=(

char*)

&ts;

bind[

3].buffer_length 

=sizeof

(ts);

length[3] 

=sizeof

(ts);

bind[

3].length =&

length[3];

bind[

3].is_null=&

is_null[3];

dword time1 

=get_time();

for( 

inti =0

; i 

<

insert_item_cnt;

++i )

if( mysql_stmt_execute(stmt) )

//printf("total effect rows [%d]\r\n",(int)mysql_stmt_affected_rows(stmt));

}dword time2 

=get_time();

fprintf(stdout,

"stmt insert %d items,during time[%d]\r\n

",insert_item_cnt,time2

-time1);

return

true;}

直接插入的**

bool

insert()

;int

len 

=snprintf(query,

1024,"

insert test(col1,col2,col3,col4) values('%s','%s','%s',now())

",varchar_var,char_var,blob_var);

dword time1 

=get_time();

for(

inti =0

;i <

insert_item_cnt;

++i )

dword time2 

=get_time();

fprintf(stdout,

"direct insert %d items,during time[%d]\r\n

",insert_item_cnt,time2

-time1);

return

true;}

下面是測試結果

插入語句條數

預處理耗時(單位微秒) 

直接操作耗時(單位微秒)

10000

660763

746571

100000

8597130

8784918

1000000

95070524

100157193

可以看出,插入方面,預處理效率要高些

預處理 編譯 連線 執行

1.預處理階段 編譯器以c檔案作為乙個單元,首先讀這個c檔案,發現第一句與第二句是包含乙個標頭檔案,就會在所有搜尋路徑中尋找這兩個檔案,找到之後,就會將相應標頭檔案中再去處理巨集,變數,函式宣告,巢狀的標頭檔案包含等,檢測依賴關係,進行巨集替換,看是否有重複定義與宣告的情況發生,最後將那些檔案中所有...

預處理 編譯 彙編 鏈結 執行

步驟 所進行的內容 生成的檔案 預處理展開標頭檔案 巨集替換 去掉注釋 條件編譯 test.i main i 編譯檢查語法,生成彙編 test.s main s 彙編彙編 轉換機器碼 目標檔案 test.o main.o 鏈結鏈結到一起生成可執行程式 可執行檔案 a.out 巨集優點 缺點 靜態鏈結...

直接執行查詢和命令 LINQ TO SQL

linq to sql提供了基於資料庫表的強型別訪問方式,但仍然有朋友老是說,能不能還是直接編寫t sql進行查詢和操作呢?因為我知道很多之前查詢的系統需要支援更加動態化和使用者定製化的查詢。答案當然是可以的 這裡的特殊之處,在於executequery返回的仍然是強型別。這沒有什麼不好。但這一點就...