mysql優化設計方案

首先講一下項目的場景:

1:這是一個基於web的java項目,其主要功能是對一些視音頻信息的處理跟展示,其中視音頻數據是由爬蟲進行爬取的千萬級別量的數據

2:該項目使用的是mysql5.5版本的數據庫

3:該項目有一個搜索的功能,需要根據關鍵字在千萬條數據中模糊匹配查詢出相應的數據

4:該項目可能面向的用戶會比較多,會出現大量高併發


主要涉及問題:

1:本項目對於數據的讀操作需求遠大於寫操作,而且考慮到寫操作可能出現的事務問題需要選擇innodb作爲搜索引擎。然而innodb讀取的性能遠遠低於myIsam

2:由於數據量比較大,對於搜素功能的實現時我們需要使用到模糊查詢,此時i需要使用like '%keywords%',那麼mysql的搜索將不走索引而是進行全表搜索,那麼每次搜索查找都需要消耗至少50秒的時間,這樣對性能要求是絕對不允許的


針對以上問題做出以下的解決方案:

1:對數據庫進行讀寫分離,分配1主(Master)1從(Slave)的數據庫 ,Master爲可讀寫數據庫(使用innodb搜索引擎:爲了支持事務),Slave爲只讀數據庫(使用myisam數據引擎:只讀可考慮不支持事務,而使用myisam可以提高檢索速度)。

1)讀寫分離需要注意的一點:slave中數據會有延遲,在master中數據進行寫入後slave需要一定時間後纔會得到同步,所以需要我們項目對於實時性的要求不用做到絕對的精確。

2)讀寫分離使用於讀遠大於寫的場景,如果只有一臺服務器,當select很多時,update和delete會被這些select訪問中的數據堵塞,等待select結束,併發性能不高,所以進行讀寫分離還能提高併發性能。

3)讀寫分離減少了服務器的壓力,使數據庫不那麼容易奔潰

2:在slave數據庫中考慮到全文檢索性能問題,使用mysql+coreseek

1)對於mysql數據庫,在5.6版本前只有myIsam搜索引擎支持全文索引(fulltext關鍵字),5.6版本後支持innodb的全文索引。然而它們卻不支持中文的索引,這對於我們這個項目需要的中文搜索是個很大的問題。

2)一開始我的想法是使用lucence進行中文分詞索引,但是效率跟使用方法都沒有達到理想的效果,比較lucence不是針對數據庫來的

3)之後是選擇了sphinx,然而sphinx也是不支持中文的,想要支持到中文需要自己做很多處理。

4)最後選擇了coreseek,它是中華民國的偉大開發者們開發的支持中文分詞的,支持mysql的一個全文檢索的一個搜索引擎(它是基於Sphinx的),它對於千萬級別數據的搜索速度能達到零點幾的級別。用它結合mysql能解決問題2。

以下是流程圖:


在web中通過調用sphinx提供的api我們能夠檢索出mysql中對於的主鍵id值,然後再通過這些id值查詢數據庫(走數據庫中的索引),這樣就能大大的提升搜索的速度了。


當然這只是我個人的解決方案,可能有很多不足之處,希望大家幫忙糾正學習

發佈了35 篇原創文章 · 獲贊 133 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章