請教:delphi + mysql 很慢 |
尚未結案
|
howell
一般會員 發表:13 回覆:30 積分:8 註冊:2003-05-09 發送簡訊給我 |
請教各位先進,在採用delphi mysql通過dbexpress實現時,我發現這樣一個
問題,使用SQLClientDataSet時記錄筆數超過十萬後,在執行程式時明顯慢了
下來,與採用SQLQuery方式相比,慢了許多,後使用sqlmonitor1查看了一下,
在log中看到如下的情(用三百筆記錄來測試)
SQLConnection1
SQLQuery1
DataSource1
SQLMonitor1 MySQL - mysql_init
MySQL - mysql_real_connect
select * from test limit 0,300 MySQL - mysql_real_query
MySQL - mysql_field_count
MySQL - mysql_use_result
MySQL - mysql_fetch_field
MySQL - mysql_fetch_row
MySQL - mysql_fetch_lengths ****************************************************** SQLConnection1
SQLClientDataSet1
DataSource1
SQLMonitor1 MySQL - mysql_init
MySQL - mysql_real_connect
select * from test limit 0,300
MySQL - mysql_real_query
MySQL - mysql_field_count
MySQL - mysql_use_result
MySQL - mysql_fetch_field
SHOW INDEX FROM test
MySQL - mysql_real_query
MySQL - mysql_field_count
MySQL - mysql_use_result
MySQL - mysql_fetch_field
MySQL - mysql_fetch_row
MySQL - mysql_fetch_row
MySQL - mysql_fetch_lengths
MySQL - mysql_fetch_row
MySQL - mysql_fetch_lengths
MySQL - mysql_fetch_row
MySQL - mysql_fetch_lengths
MySQL - mysql_fetch_row
...不斷的重複了三百次
MySQL - mysql_fetch_lengths
MySQL - mysql_fetch_row
MySQL - mysql_free_result
後又對dbgrid使用與不使用作了一下對比(用三十萬筆記錄作測試)
發現,dbgrid並不是直接影響顯示速度的關鍵,而問題所在是發生在
dbexpress的SQLClientDataSet中每一筆記錄都做上了
MySQL - mysql_fetch_lengths;MySQL - mysql_fetch_row
兩個動作,而採用sqlquery時它就只做了一次,懷疑這就是至使速度變慢的
直接原因,後來,在 SQLConnection1
SQLQuery1
DataSetProvider1
ClientDataSet1
DataSource1
SQLMonitor1
情況下,亦有這種慢速情況,所以猜測,這是不是sqlClientDataSet繼承了
ClientDataSet這個特性所致? 請問各位先進,有何辦法可以解決這種多餘的動作? 說明:數據表本身有五十萬筆記錄,cpu intel c2 533 128m
sdram ibm 20g disk
|
howell
一般會員 發表:13 回覆:30 積分:8 註冊:2003-05-09 發送簡訊給我 |
|
chih
版主 發表:48 回覆:1186 積分:639 註冊:2002-04-02 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
你是用 Delphi 6 的嗎?
Delphi 6 的 dbExpress (由其是 TSQLClientDataSet) 技術有明顯問題所以 Delphi 7 已放棄使用 TSQLClientDataSet 並修正了很多問題。 若你不是建立多層式的,建議你使用 Zeos Lib (免費的第三者元件),出了名接 MySQL 隱定和快速。 若你要使用多層,可考慮 CoreLib 的元件或 dbExpress Driver。 詳細資料參見拙作 :
Delphi MySQL 的問題探討
http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27168
|
howell
一般會員 發表:13 回覆:30 積分:8 註冊:2003-05-09 發送簡訊給我 |
謝謝兩位的解答,
這幾天,按兩位的指示認真查閱了相關的資料,並逐一驗證,情況如下: 改裝了delphi7.0後,7.0中用SimpleDataSet代替了SQLClientDataSet
我不知道,其他功能上有多少大的改變,但就我上面提過的很慢現象,沒
有得到改善,log中還可以看到
MySQL - mysql_fetch_lengths
MySQL - mysql_fetch_row
重復的次數與查詢或表本身的記錄數相同,說明,dbexpress本質問題還未解決
這也是我提憂的地方,不知道以後的dbexpress是否還是緊緊地咬著SQLClientDataSet的尾巴不放...如果這樣,這個問題以後都解決不了 幸好的是mydac正如Justmade所講一樣的優秀,100萬筆記錄只花了七秒加載就
能輕鬆的顯現在表格中,而唯一不足的就是加載後第一次按"最後一筆記錄"
時,要有一段時間的等待,100萬筆記錄大約是20秒左右吧,在此之後,不論你怎麼
定位記錄的位置也不會出現等待了.另一個不足的就是:她要收費...真的可惜. 另一個就是Zeos,我試過了一會,似乎有bug,響應好慢,所以一會兒就把它刪除了 其他的我也試過了一下,沒有再比mydac好的了, 除了dbexpress puls 1.1測試版多了一些新東西...
還有一個mysql.pas,以及tmysql對mysql.pag作了一小點修辭外,都沒什麼驚喜了
現在都不知如何下手好,最省錢的做法的,等新版的dbexpress出來....
但都不知哪個時候的事了...
再一次多謝兩位先進為我作答!
謝謝!
|
howell
一般會員 發表:13 回覆:30 積分:8 註冊:2003-05-09 發送簡訊給我 |
|
howell
一般會員 發表:13 回覆:30 積分:8 註冊:2003-05-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |