線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2708
推到 Plurk!
推到 Facebook!

用ODBC遠端連線MYSQL查詢逾時

答題得分者是:暗黑破壞神
chenyk
高階會員


發表:14
回覆:95
積分:171
註冊:2002-07-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-05 17:23:56 IP:202.39.xxx.xxx 訂閱
我使用 delphi附的 stocketServer,Mysql 版本是 v3.23
Client 端程式用 Delphi附的元件 透過ODBC 向 Mysql查詢資料
當我查詢
SELECT * FROM tb_A
時都沒有問題,但當我查詢
SELECT * FROM tb_A LEFT JOIN tb_B ON tb_A.no=tb_B.no where tb_A.no > 1 and tb_A.no < 100
如果 tb_B的資料量大些,Client 端程式在查詢時,就會出現沒有回應的狀況。
但若把 Client端程式拿到 MySQL 主機上執行,結果又是正常的。
我曾試過用 TEMPORARY TABLE 但似乎效果不彰
不知各位先進 有沒有什麼建議,供小弟參考
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-06 09:11:24 IP:61.220.xxx.xxx 訂閱
SELECT * FROM tb_A LEFT JOIN tb_B ON tb_A.no=tb_B.no where tb_A.no > 1 and tb_A.no < 100
如果 tb_B的資料量小些正常嗎 ?

如果正常, 就放寬 MySQL回應時間

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
chenyk
高階會員


發表:14
回覆:95
積分:171
註冊:2002-07-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-07-06 23:19:37 IP:123.195.xxx.xxx 訂閱
我所遇到狀況是這樣沒錯, tb_B 的資料多一點, 就會發生無回應的現象
有時候在某些有跨到HUB的區網,情況就會變糟。我不知道兩者有沒有關係

再請教 要如何放寬 MySQL回應時間呢


暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-07-07 01:24:34 IP:61.225.xxx.xxx 未訂閱
你查一下我所發表的用C API去CALL MySQL 的方法。你試看看會不會有這個情況。
你的問題我認為應該在你的 ODBC 不是在 MySQL
因為你的ODBC一直等不到 MySQL 的回應。(因為動作太久了)
當它離線。所以你試看看不經 ODBC 只經由 MySQL 的 API
去試看看。如果問題在ODBC,那就由它的參數進行調整。
agogorz
初階會員


發表:9
回覆:34
積分:28
註冊:2005-04-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-07-09 17:45:31 IP:203.75.xxx.xxx 訂閱
試試把後面的where的敘述放到前面的from
from (select * from tb_a where no>1 and no <100 ) a
a是tb_a的代號,敘述句中有要用到a的欄位就以a.no這樣做

===================引 用 chenyk 文 章===================
我使用 delphi附的 stocketServer,Mysql 版本是 v3.23
Client 端程式用 Delphi附的元件 透過ODBC 向 Mysql查詢資料
當我查詢
???? SELECT * FROM tb_A
時都沒有問題,但當我查詢
??? SELECT * FROM tb_A LEFT JOIN tb_B ON tb_A.no=tb_B.no where tb_A.no > 1 and tb_A.no < 100
如果 tb_B的資料量大些,Client 端程式在查詢時,就會出現沒有回應的狀況。
但若把 Client端程式拿到 MySQL 主機上執行,結果又是正常的。
我曾試過用?TEMPORARY TABLE?但似乎效果不彰
不知各位先進 有沒有什麼建議,供小弟參考
編輯記錄
agogorz 重新編輯於 2007-07-09 17:46:29, 註解 無‧
chenyk
高階會員


發表:14
回覆:95
積分:171
註冊:2002-07-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-07-10 10:42:15 IP:202.39.xxx.xxx 訂閱
同版主所言,改成直接連線,查詢的反應雖然還是慢了點,但至少程式不會無回應,
我的ODBC 是 v3.51 我找半天找不到可以設定的地方 T_T

我所使用MySQL 是v3.23,aqoqorz兄的 SQL Command,我記得要 v4.0以上的版本才有支援
先感謝aqoqorz 兄的答覆,我得要花點時間測測看。
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-07-10 12:17:38 IP:218.170.xxx.xxx 未訂閱
所以推斷沒有錯。
因為你的 select * from tb_a 這個動作 sql server 並不用做什麼事。
所以它不必有什麼處理。資料就可以在你下完指令時,”一直送”給你。

而 select * from tb_a left...... 這個動作,sql server 會先去把資料撈出來。
然後做完 join....etc 的動作後才開始傳給你。
因此會被視為過久沒回應而斷線。

三個方法。
一是改用 C API.
不過,這等於要你放掉 Borland Database 的元件。可能會要你的命。^_^
二是調 MySQL 的參數。把它的處理可以加快。包括他能動用的記憶體大小。
這個動作,你要去查 MySQL 的手冊了。
調整它看看會有什麼結果。
三就是去找ODBC,讓它不要那麼快把它當離線。^^
===================引 用 chenyk 文 章===================
SELECT * FROM tb_A
時都沒有問題,但當我查詢
SELECT * FROM tb_A LEFT JOIN tb_B ON tb_A.no=tb_B.no where tb_A.no > 1 and tb_A.no < 100
如果 tb_B的資料量大些,Client 端程式在查詢時,就會出現沒有回應的狀況。


T-Jason
一般會員


發表:5
回覆:20
積分:10
註冊:2003-05-19

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-07-10 15:33:50 IP:219.87.xxx.xxx 訂閱

where tb_A.no > 1 and tb_A.no < 100
用區間做查詢時最好不要這樣下
===================引 用 chenyk 文 章===================
我使用 delphi附的 stocketServer,Mysql 版本是 v3.23
Client 端程式用 Delphi附的元件 透過ODBC 向 Mysql查詢資料
當我查詢
SELECT * FROM tb_A
時都沒有問題,但當我查詢
SELECT * FROM tb_A LEFT JOIN tb_B ON tb_A.no=tb_B.no where tb_A.no > 1 and tb_A.no < 100
如果 tb_B的資料量大些,Client 端程式在查詢時,就會出現沒有回應的狀況。
但若把 Client端程式拿到 MySQL 主機上執行,結果又是正常的。
我曾試過用TEMPORARY TABLE但似乎效果不彰
不知各位先進 有沒有什麼建議,供小弟參考
chenyk
高階會員


發表:14
回覆:95
積分:171
註冊:2002-07-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-07-13 09:11:17 IP:202.39.xxx.xxx 訂閱
ODBC我查過了..可能我找的方向不對,找不到可以設定的地方
目前我使用 create temporary tb_c ... Select * from tb_b where ...
的方式先簡化 tb_b 的資料量,再跟 tb_a 進行合併查詢,
實際上有獲得一些改善。因為測的時間不長,所以不知道是否
能確實解決這問題。
MySQL升級或許也能改善,但工程很大,有機會我會試試看。
在此謝謝各位先進的回覆
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-07-13 10:40:29 IP:61.220.xxx.xxx 訂閱
設定 MySQL 的 connect_timeout 值方法
[root@localhost]# mysql 
mysql > show variables;
mysql > set global connect_timeout=10;
[root@localhost]# echo "mysql > show variables; " | mysql 
[root@localhost]# echo "set global connect_timeout=10; " | mysql 
或修改 /etc/my.cnf ( Fedora Linux 下, MS-Windows 下請自己找一下)
[mysqld]
connect_timeout = 10;
記得改完後要重新啟動 mysql
service mysqld restart
您可以自己看看是否有其他相關變數
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2024-07-02 9:01:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!