2009-11-26 229 views
0

我有一個數據庫表中的中文字典(約300 000行)在線字典。數據結構如下:MySQL數據庫搜索

ID  ch_smpl  pinyin  definition 
---------------------------------------- 
1  我   wǒ   I, me 
2  我們   wǒmen  we, us 
etc. 

我不擅長php和mysql,所以問題是如何設置搜索引擎?我發現了一堆關於php mysql搜索的教程,我也找到了一些全文搜索的例子,但我不確定它如何與中文字符一起工作。搜索速度對我來說非常重要。

如何組織用於此目的的搜索引擎任何建議都非常讚賞。

回答

0

你的 「搜索引擎」 的速度主要取決於三個方面:

  1. 你的SQL查詢
  2. 你的數據庫設計
  3. 你的MySQL配置

所以會有沒有「翻轉這個開關,你會得到超級duper性能」。你需要解決所有這些問題。除此之外,還有很多其他可能會影響性能的事情。例如:操作系統,硬盤驅動器,存儲器等等量

讓我們開始與MySQL配置。你應該先嚐試一下mysql的查詢緩存功能。如果您主要讀取操作,則可以提高性能,因爲所有內容都來自緩存並且不需要I/O操作。

這裏閱讀:MySQL Documentation on Query Cache

的另一個重要領域是數據庫設計或數據庫引擎選擇。基本上你有三種選擇:InnoDB,MyIsam和Memory(還有其他的,但我不太瞭解它們)。

據我所知MyISAM和內存只支持表鎖,而不是行鎖定。但是,如果你主要做閱讀操作,這不會影響你。一般來說,它們都比InnoDB更快。如果我是你,我會從記憶開始,因爲一切都在記憶中。但請注意這些含義:您可能需要更多內存,並且如果服務器崩潰,您將丟失未保存的數據。在另一方面

InnoDB的爲您提供了大量的數據的安全性,也可以是非常快,如果你配置是否正確。不幸的是這是一個廣泛的領域。所以我不會涵蓋這一切。首先,將innodb_buffer_pool_size設置爲大約80%的內存。所以如果你有10GB的RAM,你可以將它設置爲8GB。

如果你的服務器有8個以上CPU您可能還需要設置innodb_thread_concurrency參數較大的數字。您應該使用2 * CPU數量。

如果您想了解更多關於MySQL的性能,你應該抓住一杯咖啡,讀此博客:MySQL performance blog

另一個重要的事情可能是一些你列使用索引。但我真的不能告訴它是否會在你的情況還清,因爲我在中國的字典的知識是有限的;)

一般來說你的主鍵字段應該有一個索引。除此之外,您還可以使用索引來查看您經常查詢的字段並且很少更改(索引字段上的每個更改都會使索引無效,因此必須重新編譯 - >性能問題)。

據我所知,它也應該只用於列中包含大量不同數據的情況。如果你有一個只包含「男性」或「女性」的欄目「性別」,你很可能只會將索引樹打破一半。如果你有100個用戶,你最終將得到50行。但是,如果您使用電話號碼的索引(大多數情況下是唯一的),則最終只會有一行更有效。

所以,也許你應該使用列索引ch_smpl

最後但並非最不重要的你的查詢。我的第一個建議是選擇儘可能少的數據。這意味着避免這樣的疑問:

select * from ... 

你的情況:如果你只是想擁有的定義我,你應該使用此查詢:

select definition from dictionary where ch_smpl = '我' 

,而不是

select * from dictionary where ch_smpl = '我' 

還要避免「Like」 - 帶有searchterm前面百分號的語句,因爲它會停用此列的索引。

例如:

select * from dictionary where ch_smpl like '%我' 

您應該只術語後使用百分比符號:

select * from dictionary where ch_smpl like '我%' 

最後一個忠告。沒有像我之前說的那樣可以翻轉的特殊開關。你可以做很多事情來獲得更好的表現。嘗試一些事情並測量性能。