2012-03-06 94 views
1

我有一個網絡應用程序構建在nginx,fastcgi和mysql頂部的代碼點火器框架如何優化這個mysql查詢?對nginx和fastcgi

我有一個支付表。表結構是here

在這張表中,國名,perminutecost vs是存儲在其上的近56,373條記錄。


在主頁

,有可能要求用戶輸入自己的手機號碼在

這裏是我的後端代碼來檢索我使用的自動完成功能的用戶類型perminute cost.Btw形式:

$ STR保持用戶輸入(手機號碼)

$ RET = TRUE; $ count = 3;

 while($ret){ 
      $sub = substr($str,0,$count); //9053 
      $ret = R::getAll("SELECT Destination,PerMinuteCost FROM `payout` WHERE `Prefix` REGEXP '^$sub(.)*$' LIMIT 0 , 30"); 
      $count++; 
     } 

     $sub = substr($str,0,$count-2); 

     $ret = R::getAll("SELECT Destination,PerMinuteCost FROM `payout` WHERE `Prefix` REGEXP '^$sub(.)*$' LIMIT 0 , 30"); 

     return $ret[0]; 

這段代碼可以讓我從一個手機號碼perminutecost得到。(表所擁有的只是前綴不是所有的手機號碼)

我做了nginx的和FastCGI一些修改,延長超時限制

但是當太多的人使用該服務的同時,mysqld的CPU使用率越來越超過100%,

我怎麼能改善這種算法?

謝謝。

+1

是對自動完成正則表達式?因爲我會立即刪除它。 – Woot4Moo 2012-03-06 14:55:12

+0

:)這是我的快速生產code.Now我正在尋找優化。 – 2012-03-06 14:56:58

+0

你可以在用戶輸入的樣本中發帖嗎?你是否建議他們輸入'0'然後'01'然後'012'? – tristanbailey 2012-03-06 14:59:07

回答

3

我認爲只是一個LIKE' $ sub%'會比正則表達式更快,如果它們沒有自動完成直到3個數字,它可能會更好地爲您的分貝。

發佈一些示例SQL輸出,如果您將「EXPLAIN」放在此腳本之外的sql開頭。

+1

同時爲表單的最後輸入的值添加某種緩存可能會使大多數常見搜索更快 – tristanbailey 2012-03-06 15:02:19

+0

我應該在nginx上做到這一點嗎? – 2012-03-06 15:03:50

+0

nginx與MySQL有什麼關係? – 2012-03-06 15:11:27

3

您可以創建另一個表,爲您的前綴存儲前綴。例如,如果支付表中的條目具有前綴= 12345,則您的prefixTable將包含5個關聯的行:1,12,123,1234和12345.每個條目都將通過外鍵鏈接到原始記錄。要進行搜索,您可以在prefixTable中找到完全匹配,然後返回到您的支付表以獲取支付信息。

這當然會佔用服務器上的更多空間,但應該爲您提供顯着的速度提升。

1

Prefix列從TEXT轉換爲具有最小所需長度的VARCHAR列,並在Prefix列中添加索引。

然後,而不是使用正則表達式,使用LIKE%通配符:

SELECT Destination, PerMinuteCost 
FROM `payout` WHERE `Prefix` LIKE '$sub%' 
LIMIT 0 , 30 
+0

太棒了!將做到這一點!! – 2012-03-06 15:33:14

+0

如果它們都是具有相同長度(或類似)的數字,則可能只是希望int列落在varchar上,因爲所有varchar行最終都會作爲最長條目的數據長度進行存儲。加上你不會錯誤地輸入一個字符,除非你需要空格? – tristanbailey 2012-03-12 09:38:53

+0

@tristanbailey,VARCHAR值不會被存儲爲最長條目的數據長度。這對索引來說並非如此。 VARCHAR列使用第一個到第二個字節來存儲每行的值的長度。餘數實際上是可變長度,與該值匹配。 – 2012-03-13 03:00:32