2012-10-24 113 views
3

嗨,我知道有很多專用於查詢優化策略的主題,但是這個是如此具體,我無法在interenet上的任何地方找到答案。我需要加快大型表上的特定的mysql查詢

我在eshop(appx。180k行)中有大型產品表格,表格有65列。是的,我知道它很多,但是我存儲了關於書籍,DVD,藍光和遊戲的信息。

儘管如此,我並沒有考慮到查詢中的很多列,但select仍然非常棘手。有許多條件需要考慮和比較。下面

SELECT * 
FROM products 
WHERE production = 1 
AND publish_on < '2012-10-23 11:10:06' 
AND publish_off > '2012-10-23 11:10:06' 
AND price_vat > '0.5' 
AND ean <> '' 
AND publisher LIKE '%Johnny Cash%' 
ORDER BY bought DESC, datec DESC, quantity_storage1 DESC, quantity_storege2 DESC, quantity_storage3 DESC 
LIMIT 0, 20 

查詢我已經試圖把有指標逐一的cols在where子句中,甚至在ORDER BY子句,然後我試圖在(生產,publish_on,publish_off,price_vat,建立複合索引EAN )。

查詢速度仍然很慢(幾秒鐘),因爲它的eshop解決方案和人員因爲不能快速獲得結果而需要離開。而且我還沒有計算我需要執行搜索所有找到的行的時間,所以我可以進行分頁。

我的意思是,讓它快速的最好方法是簡化查詢,但在這種情況下,所有條件和排序都是必須的。

任何人都可以幫助解決這類問題嗎?是否有可能加快這種查詢,或者有任何其他方式,我可以例如簡化查詢,並在PHP引擎上留下餘下的結果進行排序。

哦,Iam真的無能爲力了..與我們分享您的智慧peple,請...

提前感謝

+1

不使用*僅使用字段移動你想要 –

+0

和運行解釋,看看發生了什麼 –

+0

爲表添加唯一或主索引。 –

回答

4

首先,一定要選擇和更具體的東西刪除「*」

Select * from 

什麼

Select id, name, .... 

在你的表中沒有Join或其他任何東西,所以加速選項很小,我認爲。

  1. 檢查您的mysql服務器是否可以使用足夠的內存。 看看你的my.cnf中的這個confis

    • key_buffer_size = 384M;
    • myisam_sort_buffer_size = 64M;
    • thread_cache_size = 8;
    • query_cache_size變量= 64M
  2. 看看一個最大允許的併發。 MySQL的建議CPU的* 2

    thread_concurrency = 4

  3. 你真的應該想的分裂取決於所使用的信息和標準規範化的表格。如果可能的話。

  4. 如果這是一個無法拆分表的高效系統,那麼考慮一下緩存服務器。但是,如果你有很多相同的重複查詢,這隻會有所幫助。

這就是我對底層實現或系統一無所知時所要做的。

編輯: 儘可能多地索引列可以不一定會加速系統。越多的索引≠更多的速度。

0

THX各位好的話..

我找到了解決辦法可能是因爲我能夠從2,8s減少查詢時間縮短到0.3秒。

解決方案: 使用SELECT *在大型表格(65cols)上真的很天真,所以我意識到我只需要其中的25頁 - 其他可以很容易地在產品頁面上使用。

我也重新編制了我的表格。我創建複合索引上

生產,publish_on,publish_off,price_vat,EAN

然後我創建了一個又一個specificaly搜索包括的cols

標題,出版商,作者

我做的最後一件事就是使用查詢如

SELECT SQL_CALC_FOUND_ROWS ID, title, alias, url, type, preorder, subdescription,.... 

這讓我算算影響行更快使用

mysql_result(mysql_query("SELECT FOUND_ROWS()"), 0) 

的mysql_query()之後......不過我不明白怎麼會更快,因爲EXPLAIN EXTENDED說,查詢不使用任何指標,它仍然是0.5s,然後計算單個查詢中的行數。

它似乎工作得很好。如果按順序排列的條款不是很快,但那是我沒有影響的東西。

仍然需要檢查我的服務器設置...

感謝你們所有的幫助..