2011-06-14 78 views
2

我有兩個表。第一個包含所有項目信息,第二個包含帶有類別ID的項目ID。原因是因爲一個項目可以在多個類別中。我的桌子上有大約50萬件物品。MySQL選擇查詢加入和大量的結果優化

下面是一個選擇查詢爲例:

SELECT SQL_CALC_FOUND_ROWS items.* 
FROM items 
    INNER JOIN cat 
     ON items.iid=cat.iid 
WHERE (items.expire>'1308061323' AND cat.cid = '1') 
AND (items.code=71 OR items.code=23) 
ORDER BY price DESC 
LIMIT 0, 50 
  • IID =項ID
  • CID =類別ID
  • 代碼=我只使用用於搜索的代碼。
  • 到期=到期時間爲 項目

因爲我想顯示的總匹配結果我使用SQL_CALC_FOUND_ROWS。我在頁面上只顯示50個項目(限制0,50)。

當我執行該查詢時,我的php頁面需要大約5秒鐘的時間才能加載(小於1而沒有查詢)。

  • 有沒有辦法優化它?
  • 使用SQL_CALC_FOUND_ROWS或使用SELECT COUNT(*)的第二個查詢會更快嗎?
  • 我聽說過索引,但我不知道如何使用它們以及它們的功能。他們能幫忙嗎?
+1

你對這兩張桌子有什麼指數?請發佈(在問題中添加表格的定義)。 – 2011-06-14 14:52:44

回答

3
  1. 是的,你可以,通過使用索引。
  2. 這是更好地使用2查詢,在這裏看到: Is there an effect on the speed of a query when using SQL_CALC_FOUND_ROWS in MySQL?這裏:To SQL_CALC_FOUND_ROWS or not to SQL_CALC_FOUND_ROWS?
  3. 索引有助於MySQL來找到DATAS更快。在這裏,你需要一個關於代碼,cid,過期和價格的索引。

你可以通過執行此創建items.code索引:

CREATE INDEX idx_items_code ON items (code); 

應該提高查詢immedialty。

我的建議是通過閱讀stackoverflow.com上的一些文章來了解索引是如何工作的。

這裏是一個很好的一個:What is an index in SQL Server?

編輯:

如果索引是很好的,我可以創建在各個領域 指標。什麼是使用索引的 後果?

實際上,索引是一個銀彈。它每次都有效。太長的查詢,繁榮,做一個索引。這就是爲什麼當您創建主鍵時,MySQL會在該字段中添加一個索引。

另一方面,索引在服務器上佔用空間,其他操作:刪除,更新,插入,會花費一點時間。

所以,如果你不刪除,更新或插入太頻繁,並選擇了很多,你幾乎可以爲每個字段創建一個索引。

最好的是太充分理解索引的使用,所以你可以做出不錯的選擇。

+0

如果索引很好,我可以在每個字段上創建索引。使用索引有什麼後果? – Marm 2011-06-14 15:00:17

+0

在大多數情況下,一個或兩個設計良好的索引將更有效地使用散射槍方法。 – Jaydee 2011-06-14 15:03:39

0

如果您沒有對數據庫進行任何選擇,頁面將始終加載速度更快。

我認爲你的問題是關於你的頁面服務時間長度的問題,而不是函數的具體使用。

您是否嘗試過在SQL之前和之後設置時間戳,以確定所需的確切時間。您說您將結果集限制爲50行,但您實際傳輸給您的頁面有多少數據?

其他腳本正在發生什麼?你正在處理結果,並且腳本是否經過了優化?

只是想我會列出其他一些你應該看的東西。