2013-11-04 69 views
0

我有這樣大mysql數據庫慢acctions

enter image description here

數據庫它有一個網站,我抓住了一個PHP腳本和Linux cron作業

後,我得到的所有網頁的內容網站它會慢慢地工作

和服務器負載是: enter image description here

現在我不能運行這樣的小查詢

SELECT * FROM `content` WHERE `html` LIKE '%%simple%%' 

我認爲3gb對於MySQL來說並不是太大! 該服務器有雙5620 cpu與32克的ram 與這個硬件,我認爲它可以處理高達2 TB的分貝!

更新1: 我的內容表是這樣的 enter image description here

我有一個指數,它的ID,但是像這種需要查詢大量的時間來運行過

<?php echo mysql_num_rows(mysql_query("SELECT * FROM pages where `update_date`!='0000-00-00 00:00:00' and `type`='page';")); ?> 

你的意思我只是將html字段更改爲全文!?

+2

您需要將FULL TEXT索引添加到表中,並且您希望切換到MyISAM並使用MATCH。 – cmorrissey

+1

@ChristopherMorrissey只有索引可能不會解決問題,因爲LIKE中的前導通配符將不允許正確使用索引。 OP需要查看的是全文搜索 - http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html他還需要將表格轉換爲MyISAM才能使用這種搜索並在將執行搜索的字段中提供FULLTEXT索引。 –

+1

我很震驚沒有人讓你運行一個'EXPLAIN'但是...... –

回答

4

使用LIKE作爲雙方的通配符不允許MySQL使用索引(如果該字段已被索引),因此3GB的數據庫實際上需要花費相當長的時間。我建議使用FULLTEXT索引刪除左手通配符並(可能)看看MATCH AGAINST

更多:http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

值得一提的是,MySQL的PRIOR到5.6版本,您需要將表格轉換爲MyISAM數據以利用FULLTEXT引擎。在5.6及更高版本中,您可以在InnoDB和MyISAM中使用它們。如果由於某些原因你不能升級或使用5.6+,那麼你總是可以設置一個MyISAM表格,並且只有你需要爲FULLTEXT存儲的信息。然後設置觸發器,從InnoDB中刪除信息,從MyISAM表中複製/刪除信息。這可能不符合您的項目目標,但它是一個解決方案。

+2

您可能會添加該OP將需要利用MyISAM表並提供搜索字段上的FULLTEXT索引。 –

+1

我在我的問題中增加了一些細節 –

+1

@MikeBrant根據手冊,從MySQL 5.6開始,InnoDB現在也可以使用'FULLTEXT'索引。儘管如此,我會將其添加到我的答案中。 – Crackertastic

1

每次查詢運行時,您都在搜索30億個字符以進行字符串匹配。

You need to use an index

我也認爲你使用了錯誤的查詢謂詞,應該使用專爲這類事物設計的full-text-search。您還想索引全文搜索。

+1

索引不一定會幫助這種通配符搜索。他可能需要查看Crackertastic在這種情況下指出的全文搜索。 –

+1

我在我的問題中增加了一些細節 –

+0

@MikeBrant哦,很好,他在單詞的開頭有一個通配符,所以它不能像通常那樣使用B樹索引。全文搜索具有不同類型的索引,但我更熟悉Postgres圍繞GIN索引等東西做些什麼。 – Incognito