2012-02-29 155 views
1

我有一個數據庫與大量的廣告張貼。它在大小很小時工作正常,但現在託管公司經常暫停我的帳戶,因爲我的數據庫有超過10萬行。他們告訴我,我的查詢對我的桌子來說效率不高。所以,我做了一些在線搜索,並找到索引可能是一種解決我的查詢問題的方法。MySQL查詢優化器與索引

這裏查詢我的網站

$sql = "SELECT * 
     FROM `adstable` 
     WHERE `keytype` = '".$cate."' 
     ORDER BY `adstable`.`id` DESC 
     LIMIT 2000"; 

的$美食將在類別訪客選擇改變的基礎。我正在使用phpmyadmin,並且我想知道索引如何與上面的查詢一起工作。我創建了cate列的索引,但不知道如何使用創建的索引來優化查詢。

這裏是我如何使用

EXPLAIN 
SELECT * 
FROM `adstable` 
WHERE `keytype` = '".$cate."' 
ORDER BY `adstable`.`id` DESC 
LIMIT 2000 

添加索引

ALTER TABLE `adstable` ADD INDEX ( `keytype`) 

我得到了這樣的事情:

id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra 
1 | SIMPLE |adstable| ref | keytype  | keytype | 38 |const|49392 | Using where; Using filesort 

在此先感謝。

+0

當您選擇*時,索引將幫助的唯一方法是如果索引位於表中的每個列上。但是如果你這樣做了,我敢肯定你的主機不會那麼喜歡......你需要縮小你選擇的語句的範圍,只包含你需要的那些字段。編輯您的問題以僅包含您需要的那些列,並且有人可以幫助您創建適當的索引。 – gangreen 2012-02-29 06:18:03

+1

爲什麼你需要LIMIT 2000?當然你可以做更少的行嗎?我無法想象你會在一個頁面上投放2000個廣告:) – Daan 2012-02-29 07:21:02

回答

2

如果按cate column您的意思是keytype column,那麼您的索引已被使用。你有沒有注意到查詢有什麼改進?要檢查是否該指數是真正被在該查詢,您可以運行下面的查詢使用:

EXPLAIN SELECT * FROM `adstable` 
WHERE `keytype` = '".$cate."' 
ORDER BY `adstable`.`id` DESC 
LIMIT 2000 

您可以發表你如何創建的索引和查詢的結果提供更多的信息。

+0

我只是在列名旁邊使用「照明」符號,全部在phpmyadmin中完成。這是正確的事情嗎? – 2012-02-29 06:42:59

+0

對phpmyadmin不太瞭解,但只是在任何mysql客戶端運行一個合適的類別的前一個查詢,並應該返回一個不錯的表格:) – 2012-02-29 06:45:15

+0

嗨,Mosty,我編輯了我的問題,請讓我知道如果索引已經加入??使用查詢時,我不會遇到任何速度增加。有什麼我可以做,看看查詢是否真的有效? – 2012-02-29 16:41:05

1
  1. 它是一個MyISAM表嗎?如果是,請添加(keytype, id)索引。

  2. 如果您可以將2000限制降低到更明智的程度,如果你真的不需要2000行,請降低該值。

  3. 你真的需要SELECT列表中的所有列嗎?如果沒有,請刪除*並只寫下您需要的那些列。