分類目錄歸檔:系統開發

PHP+MYSQL運用索引實現數十萬級數據快速搜索

近期公司有個項目,是PHP+MYSQL搭建的。主表記錄數大約是150萬條左右。考慮到搜索引擎收錄,做了專門針對SEO優化的,比如搜索山東+公司,關鍵字則是“山東,公司,山東公司”,標題同樣是相關的。用戶第一次搜索,則生成一條該關鍵字的記錄,以后搜索直接在搜索次數加一。專門做了一個搜索關鍵字的sitemap來優化,搜索結果每頁80條。

運營了一段時間,沒有什么問題。最近發現很多關鍵字都是有幾十萬條記錄,就拿五金這個詞來說吧,有9萬多條記錄。點到1000頁的時候,第80000條記錄,查詢時間竟然要10秒左右。汗~難怪有客戶反映速度慢。。。。

想到了數據庫優化。為某些字段(比如所在城市(int),所在地區省份(int),公司id (int)所屬行業)建立索引,這樣在企業目錄中,即使到第8萬條記錄,時間也可以控制在一秒內。但是關鍵字查詢速度還是沒有解決。

現在的sql查詢速度是”select `*` from `st_company` {where} order by `coid` asc”。

忽然想到了mysql中有個in,于是吧查詢改成了”select `co_id` from `st_company` {where} order by `coid` asc”。然后把結果用php組合成”1,2,3,4,5,6″的字符串,在一次二次查詢”select `*` from `st_company` where `co_id` in (1,2,3,4,5,6)”,速度一下提高了10倍左右。即使用戶搜索(使用like查詢沒有索引的co_do的時侯)的時候,第8萬條數據的時候,速度與不超過一秒。效果還不錯~

上面用減少查詢字段的方法,提高了速度,忽然想到略過前邊的字段不是能更快的加快查詢速度嗎?mysql沒有top,可以說是一個很大的遺憾,只能用limit,這樣在優化肯定沒有上邊的速度快了。

忽然想到了百度那么多數據,后頁是怎么處理的呢?比如查詢“你好”,有44,700,000條記錄。修改百度get提交中的pn為10000,暈,就到76頁,及760條數據,用時0.001秒。再看Google,52,800,000 條查詢結果,最多到788條記錄,后邊就沒有了,不過Google的查詢速度竟然用到了搜索用時 2.54 秒(Google.cn),不知道他們的數據庫架構師在干什么?搜狗總共找到 266,212,429 個網頁,返回1000條結果,最后一頁(100頁)用時 0.034 秒。搜搜據說是Google提供的技術支持,搜索到搜索到約9,300,000項結果,返回了74頁,共738條結果,查詢時間很抱歉,也要1.8秒左右。有道搜索到符合 你好 的結果約 6400萬 條,看結果是是老大了,很可惜,只返回了50頁,500條記錄,用時0.156 秒。用時時間一官方網站上的查詢時間為準。

實際搜索結果沒有必要做那么多,通過比較,最終決定只返回1600條記錄,20頁。sql查詢時間0.05-0.2秒左右,還可以接受。畢竟客戶如果在前10頁找不到需要的信息。很有可能更換關鍵詞了。

在此給奉Google為上的網民們說一下,Google的技術不是最好的,最起碼數據庫架構方面做得很垃圾。以前我也一直認為Google是最棒的,但是結果呢?百度,做到全國第一,你當之無愧,不過我小看了你好久。

PHP+MYSQL運用索引實現數十萬級數據快速搜索一文,希望同樣給做tag 優化的同行提供一些幫助。

TENCENT協議的實現原理-通過自定義協議執行程序

通過Tencent://Message/可以打開QQ和朋友聊天,一直對他挺好奇?到底是什么原理?
今天,我在網上找了一下TENCENT協議的實現原理,還真找到了;文章請訪問:http://hi.baidu.com/kmiaoer/blog/item/799fd388ec403691a5c2723b.html
原來是在注冊表中修改的。
知道了原理就好辦了,我們也來寫一個

定義一個miaoqiyuan協議。實現什么功能的,哦,多了,miaoqiyuan:你好。這樣來實現彈出對話框,彈出你好。

Windows Registry Editor Version 5.00
 
[HKEY_CLASSES_ROOT\miaoqiyuan]
@="miaoqiyuan Protocol"
"URL Protocol"="D:\\miaoqiyuan\\miaoqiyuan.exe"
 
[HKEY_CLASSES_ROOT\Smiaoqiyuan\DefaultIcon]
@="D:\\miaoqiyuan\\miaoqiyuan.exe,0"
 
[HKEY_CLASSES_ROOT\miaoqiyuan\shell]
 
[HKEY_CLASSES_ROOT\miaoqiyuan\shell\open]
 
[HKEY_CLASSES_ROOT\miaoqiyuan\shell\open\command]
@=\"D:\\miaoqiyuan\\miaoqiyuan.exe\" %1"

這樣,通過miaoqiyuan:鏈接的文件都可以通過miaoqiyuan.exe打開了

下面說說怎樣來彈出對話框。

在VB中新建一個標準的EXE程序,新建一個按鈕,改名為Showmsg,雙擊,輸入END(點擊退出程序)

然后添加

Private Sub Form_Load()
    showmsg.Caption = Replace(Command(), "miaoqiyuan:", "")
End Sub

這樣就可以通過輸入miaoqiyuan:1234彈出1234的警告了

這樣就可用通過一個自定義的協議來執行程序了