2010-06-21 45 views
0

我正面臨着MySQL數據庫的一些問題。實際上,當我在我的本地主機上測試時速度很快。但是當我上傳到公共服務器時,速度很慢。數據正在顯示,但比平常花費更多的時間。有7個表格可以打開以讀取單個頁面。所以我做了第一張表,我添加了用戶名和密碼。對於最後一個表,我正在使用mysql_close($db);命令關閉數據庫。我是否需要爲MySQL創建索引?

這是正確的方法嗎?我對數據庫沒有太多的經驗。我用簡單的方法來調用數據。

$db = mysql_connect("localhost", "username", "password") or die("Could not connect."); 
mysql_select_db("database",$db)or die(mysql_error()); 
$result = mysql_query("SELECT * FROM table WHERE web='$data'")or die(mysql_error()); 
$row = mysql_fetch_array($result); 
$daysA = $row['regtime']; 
$days = (strtotime(date("Y-m-d")) - strtotime($row['regtime']))/(60 * 60 * 24); 
if($row > 0 && $days < 7){ 
    $data = $row['data']; 
    $data1 = $row['data1']; 
    $data2 = $row['data2']; 
    $data3 = $row['data3']; 
    $data4 = $row['data4']; 
}else{ 

//some function to fill database } 

然後在第七表的末尾,我添加數據庫關閉mysql_close($db);

請幫

回答

5

不知道,我很理解你的問題,但這裏有兩個一般建議考慮SQL查詢:

  • 當列是在條件中使用(即where條款),它往往是一個好主意將索引放在它上面:它通常會讓MySQL找到與where子句匹配的行而不必掃描整個表。
  • 如果您正在使用7個查詢,那麼您是否可能減少這些查詢數量?
    • 解決方案通常是在表格之間使用一些連接。
    • 另一種可能是添加一些緩存mecanism


這裏有幾個MySQL手冊的部分,可能對你很有意思:


一點題外話:請確保您在SQL查詢注入之前正確逃生$data,避免SQL Injections ;-)

0

你對「網絡」列的索引?

mysql_close完全不相關,如果您忘記了,PHP會在腳本的結尾自動調用該函數。

+0

NOp我現在沒有它...我是否需要創建一個? – mathew 2010-06-21 11:17:46

+0

是的,你需要創建一個索引。 – Naktibalda 2010-06-21 11:28:00

0

你可以使用另一種優化是將日期計算進入查詢:

$days = (strtotime(date("Y-m-d")) - strtotime($row['regtime']))/(60 * 60 * 24); 

你迫使服務器在這裏執行雙重任務:MySQL必須將'regtime'日期/時間字段從其內部格式轉換爲字符串,然後將該字符串轉換回PHP時間值(這只是一個整數)。 MySQL本身完全有能力執行date/time calculations,您可以避免雙重轉換開銷。

評論隨訪:

看的PHP代碼塊,把它歸結爲:

date('Y-m-d') - 因爲有沒有提供時間參數,則默認爲今天的時間戳(1277186400),併產生2010- 06-22 strtotime('2010-06-22') - 回UNIX時間戳記轉換,1277186400

然後

strtotime($row['regtime']) - 轉換字符串將任何日期的表示存儲在註冊時間字段中的unix時間戳。比方說,regtime是2009-12-24,所以返回的strtotime 1261634400

所以你最終(嘿,這是聖誕節又來了!):

$days = (1277186400 - 1261634400)/(60 * 60 * 24) 
$days = 180; // 180 days between Christmas and today 

因此,對事物的MySQL的側(假設該regtime場至少是「日期」字段,或日期/時間戳:

SELECT (UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(regtime))/(60 * 60 * 24) AS days 
FROM ... 

,或者因爲你有天工作作爲間隔:

SELECT TO_DAYS(now()) - TO_DAYS(regtime) AS days 
FROM ... 
+0

正如我在這裏提到的,我對MySQL並不熟悉,而且我沒有足夠的時間去學習曲線,因此如果您可以給我一個示例代碼。那麼我可以嘗試 – mathew 2010-06-22 04:20:02

相關問題