全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1654
推到 Plurk!
推到 Facebook!

請教:delphi + mysql 很慢

尚未結案
howell
一般會員


發表:13
回覆:30
積分:8
註冊:2003-05-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-05 18:53:23 IP:61.142.xxx.xxx 未訂閱
請教各位先進,在採用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-05 23:55:05 IP:61.142.xxx.xxx 未訂閱
看來,只能放棄用delphi mysql這種組合了....真系可惜...
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-06 00:05:24 IP:61.216.xxx.xxx 未訂閱
1.Delphi MySQL 的問題探討 http://delphi.ktop.com.tw/topic.php?topic_id=27168 2.如何用delphi來執行mysql備份http://delphi.ktop.com.tw/topic.php?topic_id=30598 HOPE IT HELP YOU...TRY TRY SEE
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-06 00:09:53 IP:218.16.xxx.xxx 未訂閱
你是用 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-10 23:22:28 IP:61.142.xxx.xxx 未訂閱
謝謝兩位的解答, 這幾天,按兩位的指示認真查閱了相關的資料,並逐一驗證,情況如下: 改裝了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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-10 23:30:21 IP:61.142.xxx.xxx 未訂閱
還有一個很特別的發現, 就是使用ems mysql manager 2.2.0.1這套管理mysql的軟件瀏覽同樣那個表 (一百萬筆記錄) 速度竟然比mydac要快!!! 大家知道,它是用什麼辦法來實現嗎?
howell
一般會員


發表:13
回覆:30
積分:8
註冊:2003-05-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-12 21:05:41 IP:61.142.xxx.xxx 未訂閱
昨晚問過李先生後,對於dbexpress,有了解決的辦法,就是packetrecords=1000 從而避免dbexpress一次調入全表這種機制消耗系統資料及時間動作.
系統時間:2024-06-26 13:50:16
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!