2012-04-10 145 views
1

我運行以下查詢,但我改變它,它仍然需要近5秒的運行,這是完全不能接受的......MySQL表或查詢優化

查詢:

SELECT cat1, cat2, cat3, PRid, title, genre, artist, author, actors, imageURL, 
lowprice, highprice, prodcatID, description 
from products 
where title like '%' AND imageURL <> '' AND cat1 = 'Clothing and accessories' 
order by userrating desc 
limit 500 

我已經嘗試拿出「like%」,拿出「imageURl <>」,但仍然是一樣的。我試過只返回1柱,仍然是一樣的。

我在表中的幾乎每一列都有索引,當然在查詢中提到了所有的列。

這基本上是一個類別列表。如果我在全文索引的標題欄中進行全文搜索,則只需要不到一秒的時間。

我應該在列cat1中添加另一個全文索引,並將查詢焦點更改爲與該列「匹配」?

我是否期待太多?

該表格僅有300萬行。

+0

你能告訴我們表格模式 – amd 2012-04-10 06:52:26

+0

3 mil行表和索引在幾乎每一列..這只是不好。 – 2012-04-10 07:06:39

回答

1

你說你在每一列都有索引。你有像這樣的索引嗎?

alter table products add index (cat1, userrating) 

如果你不這樣做,試試看。運行該查詢並讓我知道它是否運行得更快。

此外,我假設你實際上設置某種過濾器而不是標題,字段上的%

+1

它仍然不是輝煌的,但削減時間超過了一半 - 感謝! – 2012-04-10 11:23:15

1

您應該將cat1作爲一個整數,然後將這三百萬行中的一個字符串。您還必須正確編制索引。如果索引所有列只有改進,那麼這將是系統將會執行的默認操作。

除此之外,title LIKE '%'什麼都不做。我想你用它來搜索,以便它變成`title LIKE 'search%'

你使用任何類型的框架來獲取?如果您的框架將這些數據保存到一個大型數組中,那麼獲得500行的列數很多可能會耗盡系統。可能不是這種情況,但是:
嘗試運行普通的$query = mysql_query()while($row = mysql_fetch_object($query))

0

我建議添加一個索引與查詢列:標題,imageURL和cat1。 第二個改進:使用SQL服務器緩存,它會致命地提高速度。 最後的改進:如果您的查詢總是像這樣,只有值會更改,然後使用預準備語句。

0

嗯,我確定%作爲LIKE子句中的第一個字符,爲您提供該列的全表掃描(在您的情況下,您將不會執行全表掃描,因爲您已經限制了條款AND子句)。 除此之外,請嘗試在cat1列上添加索引。另外,爲了減少數據集的大小,嘗試將其他標準添加到查詢中 - 您的工作數據集(與查詢匹配的行數,沒有LIMIT子句)也可能太大。