用ODBC遠端連線MYSQL查詢逾時 |
答題得分者是:暗黑破壞神
|
chenyk
高階會員 ![]() ![]() ![]() ![]() 發表:14 回覆:95 積分:171 註冊:2002-07-08 發送簡訊給我 |
我使用 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 發送簡訊給我 |
|
chenyk
高階會員 ![]() ![]() ![]() ![]() 發表:14 回覆:95 積分:171 註冊:2002-07-08 發送簡訊給我 |
|
暗黑破壞神
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
agogorz
初階會員 ![]() ![]() 發表:9 回覆:34 積分:28 註冊:2005-04-09 發送簡訊給我 |
試試把後面的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 發送簡訊給我 |
|
暗黑破壞神
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
所以推斷沒有錯。
因為你的 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 發送簡訊給我 |
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 發送簡訊給我 |
|
pcboy
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
設定 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 您可以自己看看是否有其他相關變數
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |