最近閒來無事,想看看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返回的仍然是強型別。這沒有什麼不好。但這一點就...