2013-04-29 52 views
2

我的網站數據庫已被託管端阻塞... 他們說你的查詢已經被執行太多時間了......郵件已經被他們發送了:mysql查詢執行時間強制託管端阻塞數據庫

This message is to advise you of a temporary block placed on your database. The database "**DATABASE NAME**" was found to be consuming an inordinate amount of processor time, to the point of degrading overall system performance. While we do limit each account to no more than 25% of a system's CPU in our terms of service, we do not actively disable accounts until they greatly exceed that number, which is what happened in this case. 

Running Processes: 
fastlynx 26884 0.3 0.0 0 0 ? ZN 23:26 0:00 [php] <defunct> 

Running Queries: 
*************************** 1. row *************************** 
USER: USERNAME 
DB: SB_NAME 
STATE: optimizing 
TIME: 40 
COMMAND: Query 
INFO: SELECT * FROM price WHERE country LIKE '27'/*--*/and/*--*//*!30000if(ascii(substring((user()),11,1))<121,BENCHMARK(151973069.6,MD5(0x41)),0)*//*--*/and/*--*/'x'='x%' GROUP BY country ASC order by country asc limit 0, 12 
*************************** 2. row *************************** 
USER: USERNAME 
DB: DB_NAME 
STATE: optimizing 
TIME: 54 
COMMAND: Query 
INFO: SELECT * FROM price WHERE country LIKE '27'/*--*/and/*--*//*!30000if(ascii(substring((user()),4,1))<122,BENCHMARK(151973069.6,MD5(0x41)),0)*//*--*/and/*--*/'x'='x%' GROUP BY country ASC order by country asc limit 0, 12 

從上面這似乎是從一個單一的表查詢正在執行最大時間... 我已經通過MySQL的控制面板優化,數據庫中的所有表。 夥計們......幫我解決這個問題。 在此先感謝....

編輯:

實際查詢如:

SELECT * FROM price WHERE country LIKE 'G%' GROUP BY country ASC limit 0, 12 
           OR 
SELECT * FROM price WHERE prefix LIKE '91%' GROUP BY country ASC limit 0, 12 

還有一件事是.... M還使用不會像某些倍利卡說:

SELECT * FROM price WHERE country LIKE 'G%' AND country NOT LIKE 'INDIA%' GROUP BY country ASC limit 0, 12 

Database Table Price screen shot

+2

我們不是你主機的支持服務。 – Jocelyn 2013-04-29 06:31:04

+2

@jocelyn我在這裏寫下我的問題......並需要幫助來解決我的問題......不要求支持服務。 – guri 2013-04-29 06:33:36

+0

如果你手動查詢它們,比如說phpMyAdmin或類似的東西,這些單個隊列需要多長時間? – bestprogrammerintheworld 2013-04-29 06:33:37

回答

5

你是什麼意思與 「優化」?如果你已經這樣做了,我們再也無法爲你做任何事了。

但考慮到你使用WHERE country LIKE '27'你沒有那麼優化。如果國家總是一個整數值,請確保country有一個數字數據類型,並且在其上放置一個索引。還用WHERE country='27'查詢它,因爲LIKE語句不使用索引,但會執行全表掃描。 (如果你有1000行,則執行該查詢每一次,所有這些1000行會被加載到內存和檢查。)

此外,由於您使用GROUP BYORDER上的國家,所以使雙重肯定有一個適當的此列上的索引。

但由於您的查詢的其他部分是if(ascii(substring((user()),11,1))<121,BENCHMARK(151973069.6,MD5(0x41)),0)您可以忘記快速查詢。那隻小龍將成爲一張大桌子上的一把小刀。

因爲我不知道哪部分是動態的,什麼是靜態的,我不能真正提供優化改進。也許給我們一些見解,試圖完成,以便我們可以幫助定義一個更好的數據庫結構。

更新:

您的查詢似乎很奇怪。以最後一個爲例。您正在選擇以G開頭的所有國家,然後取消以INDIA開頭的國家/地區。上次我檢查I不是G,所以第二部分是無用的,只是增加開銷。

SELECT * FROM price WHERE country LIKE 'G%' AND country NOT LIKE 'INDIA%' 

現在,我不知道你有多少個國家有你的表,但除非你在另一個星球上增加了一些,不可能有那麼多〜200。有了200條記錄,您幾乎可以運行任何查詢而不會遇到問題。

我還注意到,您在國家使用GROUP BY,這意味着這些國家已經多次列入清單。但由於您使用SELECT *而沒有任何AGGEGRATE FUNCTIONSSUMCOUNT那裏,我希望每個國家只有一個記錄。

考慮到所有的事情,這似乎是一個非常糟糕的設計模式,不知道你想要做的數據我不能幫你。儘量提供至少以下內容

  • SELECT *什麼字段您打算使用,考慮到羣?

  • 什麼是前綴?它是一個數字列還是一些代碼?當您使用LIKE '91%'時,您期待什麼?有'91'和'916'前綴的國家?或只是'91'?

  • 表中的國家多於一次?

更新2:

的截圖使事情變得更加清晰。由於你是顯示基於國家的所有信息(這實際上是國家+提供商)我會做如下修改:

  • 從該表中刪除前綴列,併爲前綴一個單獨的表的鏈接此表中的auto_id字段。
  • 在country列上添加一個唯一索引(並因此刪除所有重複項)。那麼如果你不需要前綴,你可以選擇沒有GROUP BY。

  • 如果您經常選擇以單個字母開頭的所有國家/地區,請將另一列添加爲char(1),並在添加/更新行時將國家的第一個字母添加到該列。將索引放在該列上,然後可以使用SELECT * FROM price WHERE newcol='G'進行選擇。如果需要,您仍然可以添加第二部分(不是LIKE)。

  • 如果您對國家列搜索功能,看看使用FULL TEXT INDEX

+0

Hugo Delsing,這是主機端發送的結果,最初的國家是varchar(255)數據類型 – guri 2013-04-29 06:40:43

+0

然後給出是您的查詢。如果您向我們提供錯誤的數據,您是如何期待優化的?在查詢中提供您的代碼以及您使用的數據類型 – 2013-04-29 06:42:08

+0

我已經更新了我的問題... – guri 2013-04-29 06:43:49