2010-06-04 101 views
1

我知道我正在寫查詢的錯誤,當我們得到大量的流量時,我們的數據庫被擊中硬盤和頁面變慢... 我想我需要寫查詢基於來自CURDATE的最近30天的CREATE VIEW?但不知道從哪裏開始,或者如果這將更有效地查詢數據庫?最近30天爲MYSQL創建視圖

不管怎麼說,這裏是我寫了一個簡單的查詢..

$query_Recordset6 = "SELECT `date`, title, category, url, comments 
         FROM cute_news 
         WHERE category LIKE '%45%' 
        ORDER BY `date` DESC"; 

任何幫助或建議將是巨大的!我有大約11個這樣的疑問,但我有信心,如果我能得到其中的一個幫助,那麼我可以將它們實施到其餘的!

回答

0
SELECT `date`, title, category, url, comments 
         FROM cute_news 
         WHERE category LIKE '%45%' 
        ORDER BY `date` DESC 

LIKE '%45%'表示需要執行全表掃描。你可能在列中存儲了一個類別列表?如果這樣創建一個新的表存儲類別和news_article_id將允許索引被用來更有效地檢索匹配記錄。

2

把一個通配符上的值進行比較的左側:

LIKE '%xyz' 

...意味着一個索引不能被使用,即使存在一個。可能要考慮使用Full Text Searching (FTS), which means adding full text indexing

正常化數據是另一個需要考慮的步驟 - 類別應該放在單獨的表格中。

+0

想知道這會更好嗎? 選擇...從...限制50 – eberswine 2010-06-04 19:26:20

0

好吧,精神調試的時間。

在我的大腦中,我發現通過數據庫規範化可以大大提高查詢性能,具體方法是將類別多值列拆分爲具有兩列的單獨表:cute_news的主鍵和類別ID。

這也可以讓你直接鏈接所說的表到類別表,而不必先解析它。或者,正如Chris Date所說:「每一行與列的交集都只包含來自適用域的一個值(而不是其他任何東西)」。

0

任何帶有'%XXX%'的東西都會變慢。這是一個緩慢的操作。

對於類似的東西,您可能希望將類別分隔到另一個表中,並在cute_news表中使用外鍵。這樣你就可以擁有category_id,並在查詢中使用它,速度會更快。


另外,我不太清楚你爲什麼要討論使用CREATE VIEW。意見不會真正幫助你提高速度。除非它具有物化視圖,MySQL本身並不假設。

0

如果您的數據庫受到重創,解決方案不是創建視圖(視圖基本上與數據庫的工作量基本相同),解決方案是緩存結果。

這尤其適用,因爲從聽起來像,你的數據只需要每30天刷新一次。

0

我猜你的category列是類別值的列表,如「12,34,45,78」?

這不是很好的關係型數據庫設計。不好的一個原因是你已經發現:搜索可能出現在該列表中間的子字符串的速度非常慢。

有人建議使用全文搜索,而不是LIKE謂語用通配符,但在這種情況下,它是簡單的創建另一個表,所以你可以列出每行一個類別值,與參考回到你cute_news表:

CREATE TABLE cute_news_category (
    news_id INT NOT NULL, 
    category INT NOT NULL, 
    PRIMARY KEY (news_id, category), 
    FOREIGN KEY (news_id) REFERENCES cute_news(news_id) 
) ENGINE=InnoDB; 

然後你就可以查詢它會去快了很多:

SELECT n.`date`, n.title, c.category, n.url, n.comments 
FROM cute_news n 
JOIN cute_news_category c ON (n.news_id = c.news_id) 
WHERE c.category = 45 
ORDER BY n.`date` DESC 
0

任何答案是猜測,顯示:
- 相關SHOW CREATEŧ ABLE輸出
- 常見查詢的EXPLAIN輸出。

Bill Karwin的評論當然適用。

畢竟這個&優化,只有過去30天的數據採樣到一張表格仍然可能是需要的,在這種情況下,你最好運行每日cronjob做到這一點。