<s id="qx03x"></s>
  • <tt id="qx03x"><noscript id="qx03x"></noscript></tt><rt id="qx03x"><nav id="qx03x"></nav></rt>

    <strong id="qx03x"><li id="qx03x"></li></strong>
    <tt id="qx03x"></tt>

        1. 分頁: 9/31 第一頁 上頁 4 5 6 7 8 9 10 11 12 13 下頁 最后頁 [ 顯示模式: 摘要 | 列表 ]
            [文章作者:張宴 本文版本:v1.0 最后修改:2008.10.06 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/read.php/371.htm]

            今天花幾分鐘寫的一個PHP小程序,用途是:無需給程序員開放服務器SSH帳號,只需通過Web瀏覽器即可從SVN版本庫更新代碼到Linux服務器的指定目錄。如果有需要,可以給這段代碼加個密碼登錄。

            1、假設www、www是Apache或Nginx服務器的用戶名和組,/data0/www/是網頁文件存放根目錄,執行以下shell命令:
          sudo -s
          /usr/sbin/groupadd www -g 48
          /usr/sbin/useradd -u 48 -g www www
          mkdir -p /data0/www/
          chown -R www:www /data0/www/
          su www
          cd /data0/www/
          /usr/local/bin/svn checkout --username zhangyan --password 123456 http://xxx.xxx.xxx.xxx:8080/svn/web/trunk/


            2、創建文件svn_up.php:
          Tags: , ,
            UnixSNS──Linux/Unix技術工程師社交網絡,結識更多的同行人,分享前沿的新技術。

            http://www.unixsns.com

            

            [文章作者:張宴 本文版本:v1.0 最后修改:2008.09.21 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/post/369/]

            9月20日下午,我應邀參加了 ChinaUnix 舉辦的以“如何搞定服務器負載均衡?”為主題的技術沙龍(http://linux.chinaunix.net/bbs/thread-1019366-1-1.html),很高興能夠跟諸多業界精英一起探討交流,很榮幸能夠與Unix資深系統工程師──田逸、HonestQiao,以及F5資深技術工程師──楊明非,同臺演講。

            點擊在新窗口中瀏覽此圖片



            《使用Nginx輕松實現開源負載均衡》是我的演講PPT(PowerPiont),現提供下載。

            PPT分為四個部分:
            1、介紹Nginx的基本特征,以及使用Nginx做負載均衡器的理由。

            2、用實例,來介紹Nginx負載均衡在大型網站的典型應用。

            3、以實現網站動靜分離為原型,對NetScaler硬件七層負載均衡和Nginx軟件負載均衡做一個對比。
            9月13日晚,我們親臨“鳥巢”觀看北京殘奧會田徑比賽,現場激動萬分。中國選手掀起奪金浪潮,共摘下五枚金牌,并破兩項世界紀錄。

            ● 女子鐵餅F40級別的決賽中,中國選手孟根吉米素以二十八米零四的成績奪冠,并且打破世界紀錄。
            ● 女子二百米T36級別的比賽中,中國選手王芳以二十九秒五七的成績獲得金牌。
            ● 男子鉛球F37-38級決賽中,中國選手夏東以十六米六零、一千一百零四分奪金,并破世界紀錄。
            ● 男子一百米T35級決賽中,中國選手楊森以十二秒二九的成績奪冠,并打破世界紀錄,傅昕瀚以十二秒五五的成績獲得亞軍。
            ● 男子二百米T53級輪椅競速決賽上,中國小將余世然以二十六秒七九獲得冠軍。

            遠眺
            點擊在新窗口中瀏覽此圖片

            抵達
            點擊在新窗口中瀏覽此圖片
            今天,殘奧會門票追加發售。我在奧運票務網站(http://www.tickets.beijing2008.cn),用招商銀行的VISA信用卡,在線支付購得了7張“鳥巢”田徑門票(其中我和老婆兩張,其余為幫同事、朋友購買)。之后,在中國銀行憑借身份證拿到了門票。我和老婆,還有即將來京的vivi,將去觀看2008年9月13日(星期六)晚上17:00~21:45,在國家體育場(鳥巢)舉行的殘奧會田徑決賽。

            

            2008年9月13日 17:00~21:45 田徑項目:
            女子 標槍 F57/58 決賽
            女子 鐵餅F40 決賽
            男子 100米 T13 決賽
            男子 100米 T35 決賽
            男子 鉛球 F37/38 決賽
            本文已有最新版本:

            請點擊Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建勝過Apache十倍的Web服務器(第6版)




            [文章作者:張宴 本文版本:v4.14 最后修改:2009.04.14 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/nginx_php_v4/]

            前言:本文是我撰寫的關于搭建“Nginx + PHP(FastCGI)”Web服務器的第4篇文章。本系列文章作為國內最早詳細介紹 Nginx + PHP 安裝、配置、使用的資料之一,為推動 Nginx 在國內的發展產生了積極的作用。這是一篇關于Nginx 0.7.x系列版本的文章,安裝、配置方式與第3篇文章相差不大,但配置參數有不同。Nginx 0.7.x系列版本雖然為開發版,但在很多大型網站的生產環境中已經使用。

            鏈接:《2007年9月的第1版》、《2007年12月的第2版》、《2008年6月的第3版

            點擊在新窗口中瀏覽此圖片

            Nginx ("engine x") 是一個高性能的 HTTP 和反向代理服務器,也是一個 IMAP/POP3/SMTP 代理服務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,它已經在該站點運行超過兩年半了。Igor 將源代碼以類BSD許可證的形式發布。

            Nginx 超越 Apache 的高性能和穩定性,使得國內使用 Nginx 作為 Web 服務器的網站也越來越多,其中包括新浪博客、新浪播客、網易新聞等門戶網站頻道,六間房、56.com等視頻分享網站,Discuz!官方論壇、水木社區等知名論壇,豆瓣、YUPOO相冊、海內SNS、迅雷在線等新興Web 2.0網站。



            Nginx 的官方中文維基:http://wiki.codemongers.com/NginxChs



            在高并發連接的情況下,Nginx是Apache服務器不錯的替代品。Nginx同時也可以作為7層負載均衡服務器來使用。根據我的測試結果,Nginx 0.7.51 + PHP 5.2.8 (FastCGI) 可以承受3萬以上的并發連接數,相當于同等環境下Apache的10倍。

            根據我的經驗,4GB內存的服務器+Apache(prefork模式)一般只能處理3000個并發連接,因為它們將占用3GB以上的內存,還得為系統預留1GB的內存。我曾經就有兩臺Apache服務器,因為在配置文件中設置的MaxClients為4000,當Apache并發連接數達到3800時,導致服務器內存和Swap空間用滿而崩潰。

            而這臺 Nginx 0.7.51 + PHP 5.2.8 (FastCGI) 服務器在3萬并發連接下,開啟的10個Nginx進程消耗150M內存(15M*10=150M),開啟的64個php-cgi進程消耗1280M內存(20M*64=1280M),加上系統自身消耗的內存,總共消耗不到2GB內存。如果服務器內存較小,完全可以只開啟25個php-cgi進程,這樣php-cgi消耗的總內存數才500M。

            在3萬并發連接下,訪問Nginx 0.7.51 + PHP 5.2.8 (FastCGI) 服務器的PHP程序,仍然速度飛快。下圖為Nginx的狀態監控頁面,顯示的活動連接數為28457(關于Nginx的監控頁配置,會在本文接下來所給出的Nginx配置文件中寫明):

            點擊在新窗口中瀏覽此圖片

            我生產環境下的兩臺Nginx + PHP5(FastCGI)服務器,跑多個一般復雜的純PHP動態程序,單臺Nginx + PHP5(FastCGI)服務器跑PHP動態程序的處理能力已經超過“700次請求/秒”,相當于每天可以承受6000萬(700*60*60*24=60480000)的訪問量(更多信息見此),而服務器的系統負載也不高:

            點擊在新窗口中瀏覽此圖片



            安裝步驟:
           ?。ㄏ到y要求:Linux 2.6+ 內核,本文中的Linux操作系統為CentOS 5.1,另在RedHat AS4上也安裝成功)
            8月25日,在三元橋租住的房子到期。由于老婆的新單位──經濟日報旗下的中國經濟網離三元橋有點遠,于是,我們決定不再續租。我們在西直門新租了兩居室中的一室。另一室住兩個女孩,一個是網易的編輯,另一個在中國移動的12580工作??磥?,又組成了一個互聯網行業的小圈子。明天,我們將從三元橋搬家到西直門。聯系好了搬家的車,60元,單號車牌。

            西直門,或將成為我們北京租房之路的最后一站。明年6月,我們在清河小營──萊鎮香格里購買的期房將予以交付。

            西直門(遠圖縱覽)
            點擊在新窗口中瀏覽此圖片
            8月19日消息,百度大規模拆空搜索服務器硬盤傳聞獲得百度官方證實,19日下午,百度宣布搜索服務器正式使用閃存(Flash Memory)技術代替硬盤并大規模商用,百度自稱是全球首家服務器使用閃存技術的互聯網公司。

            這是否預示著一個新的存儲時代的到來?

            點擊在新窗口中瀏覽此圖片

            相關新聞:
            http://tech.sina.com.cn/i/2008-08-19/16072400910.shtml
            http://tech.163.com/08/0819/14/4JNF85V1000915BF.html

          Tags: , , ,
            [文章作者:張宴 本文版本:v1.4 最后修改:2010.06.11 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/read.php/362/]

            Tokyo Cabinet 是日本人 平林幹雄 開發的一款 DBM 數據庫,該數據庫讀寫非???,哈希模式寫入100萬條數據只需0.643秒,讀取100萬條數據只需0.773秒,是 Berkeley DB 等 DBM 的幾倍。

            點擊在新窗口中瀏覽此圖片



            Tokyo Tyrant 是由同一作者開發的 Tokyo Cabinet 數據庫網絡接口。它擁有Memcached兼容協議,也可以通過HTTP協議進行數據交換。

            Tokyo Tyrant 加上 Tokyo Cabinet,構成了一款支持高并發的分布式持久存儲系統,對任何原有Memcached客戶端來講,可以將Tokyo Tyrant看成是一個Memcached,但是,它的數據是可以持久存儲的。這一點,跟新浪的Memcachedb性質一樣。

            相比Memcachedb而言,Tokyo Tyrant具有以下優勢:

            1、故障轉移:Tokyo Tyrant支持雙機互為主輔模式,主輔庫均可讀寫,而Memcachedb目前支持類似MySQL主輔庫同步的方式實現讀寫分離,支持“主服務器可讀寫、輔助服務器只讀”模式。

            點擊在新窗口中瀏覽此圖片

            這里使用 $memcache->addServer 而不是 $memcache->connect 去連接 Tokyo Tyrant 服務器,是因為當 Memcache 客戶端使用 addServer 服務器池時,是根據“crc32(key) % current_server_num”哈希算法將 key 哈希到不同的服務器的,PHP、C 和 python 的客戶端都是如此的算法。Memcache 客戶端的 addserver 具有故障轉移機制,當 addserver 了2臺 Memcached 服務器,而其中1臺宕機了,那么 current_server_num 會由原先的2變成1。

            引用 memcached 官方網站和 PHP 手冊中的兩段話:
          引用
          http://www.danga.com/memcached/
          If a host goes down, the API re-maps that dead host's requests onto the servers that are available.

          http://cn.php.net/manual/zh/function.Memcache-addServer.php
          Failover may occur at any stage in any of the methods, as long as other servers are available the request the user won't notice. Any kind of socket or Memcached server level errors (except out-of-memory) may trigger the failover. Normal client errors such as adding an existing key will not trigger a failover.




            2、日志文件體積?。篢okyo Tyrant用于主輔同步的日志文件比較小,大約是數據庫文件的1.3倍,而Memcachedb的同步日志文件非常大,如果不定期清理,很容易將磁盤寫滿。



            3、超大數據量下表現出色:
            [文章作者:張宴 本文版本:v1.0 最后修改:2008.07.30 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/read.php/361/]

            昨日,有朋友問我,他將Web服務器換成Nginx 0.6.31  + PHP 4.4.7(FastCGI)后,有時候訪問會出現“502 Bad Gateway”錯誤,如何解決。

            我讓按照以下兩個步驟去解決,最后在第2步中將FastCGI的timeout時間增加為300,問題解決:

            PS:比較羨慕迅雷的Web服務器,16G內存。



            1、查看當前的PHP FastCGI進程數是否夠用:
          netstat -anpo | grep "php-cgi" | wc -l

            如果實際使用的“FastCGI進程數”接近預設的“FastCGI進程數”,那么,說明“FastCGI進程數”不夠用,需要增大。



            2、部分PHP程序的執行時間超過了Nginx的等待時間,可以適當增加nginx.conf配置文件中FastCGI的timeout時間,例如:
          ......
          http
          {
          ......
          fastcgi_connect_timeout 300;
          fastcgi_send_timeout 300;
          fastcgi_read_timeout 300;
          ......
          }
          ......

          Tags: , , , ,
            [文章作者:張宴 本文版本:v1.0 最后修改:2008.07.27 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/post/360/]

            前言:本文闡述的是一款經過生產環境檢驗的千萬級數據全文檢索(搜索引擎)架構。本文只列出前幾章的內容節選,不提供全文內容。

            在DELL PowerEdge 6850服務器(四顆64 位Inter Xeon MP 7110N處理器 / 8GB內存)、RedHat AS4 Linux操作系統、MySQL 5.1.26、MyISAM存儲引擎、key_buffer=1024M環境下實測,單表1000萬條記錄的數據量(這張MySQL表擁有int、datetime、varchar、text等類型的10多個字段,只有主鍵,無其它索引),用主鍵(PRIMARY KEY)作為WHERE條件進行SQL查詢,速度非常之快,只耗費0.01秒。

            出自俄羅斯的開源全文搜索引擎軟件Sphinx,單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度為0.x秒(毫秒級)。Sphinx創建索引的速度為:創建100萬條記錄的索引只需3~4分鐘,創建1000萬條記錄的索引可以在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。

            基于以上幾點,我設計出了這套搜索引擎架構。在生產環境運行了一周,效果非常不錯。有時間我會專為配合Sphinx搜索引擎,開發一個邏輯簡單、速度快、占用內存低、非表鎖的MySQL存儲引擎插件,用來代替MyISAM引擎,以解決MyISAM存儲引擎在頻繁更新操作時的鎖表延遲問題。另外,分布式搜索技術上已無任何問題。



            一、搜索引擎架構設計:
            1、搜索引擎架構圖:
            點擊在新窗口中瀏覽此圖片

            2、搜索引擎架構設計思路:
            (1)、調用方式最簡化:
            盡量方便前端Web工程師,只需要一條簡單的SQL語句“SELECT ... FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query='...';”即可實現高效搜索。

            (2)、創建索引、查詢速度快:
           ?、?、Sphinx Search 是由俄羅斯人Andrew Aksyonoff 開發的高性能全文搜索軟件包,在GPL與商業協議雙許可協議下發行。
            Sphinx的特征:
            ?Sphinx支持高速建立索引(可達10MB/秒,而Lucene建立索引的速度是1.8MB/秒)
            ?高性能搜索(在2-4 GB的文本上搜索,平均0.1秒內獲得結果)
            ?高擴展性(實測最高可對100GB的文本建立索引,單一索引可包含1億條記錄)
            ?支持分布式檢索
            ?支持基于短語和基于統計的復合結果排序機制
            ?支持任意數量的文件字段(數值屬性或全文檢索屬性)
            ?支持不同的搜索模式(“完全匹配”,“短語匹配”和“任一匹配”)
            ?支持作為Mysql的存儲引擎

           ?、?、通過國外《High Performance MySQL》專家組的測試可以看出,根據主鍵進行查詢的類似“SELECT ... FROM ... WHERE id = ...”的SQL語句(其中id為PRIMARY KEY),每秒鐘能夠處理10000次以上的查詢,而普通的SELECT查詢每秒只能處理幾十次到幾百次:
            點擊在新窗口中瀏覽此圖片

           ?、?、Sphinx不負責文本字段的存儲。假設將數據庫的id、date、title、body字段,用sphinx建立搜索索引。根據關鍵字、時間、類別、范圍等信息查詢一下sphinx,sphinx只會將查詢結果的ID號等非文本信息告訴我們。要顯示title、body等信息,還需要根據此ID號去查詢MySQL數據庫,或者從Memcachedb等其他的存儲中取得。安裝SphinxSE作為MySQL的存儲引擎,將MySQL與Sphinx結合起來,是一種便捷的方法。
            創建一張Sphinx類型表,將MyISAM表的主鍵ID和Sphinx表的ID作一個JOIN聯合查詢。這樣,對于MyISAM表來所,只相當于一個WHERE id=...的主鍵查詢,WHERE后的條件都交給Sphinx去處理,可以充分發揮兩者的優勢,實現高速搜索查詢。

            (3)、按服務類型進行分離:
            為了保證數據的一致性,我在配置Sphinx讀取索引源的MySQL數據庫時,進行了鎖表。Sphinx讀取索引源的過程會耗費一定時間,由于MyISAM存儲引擎的讀鎖和寫鎖是互斥的,為了避免寫操作被長時間阻塞,導致數據庫同步落后跟不上,我將提供“搜索查詢服務”的和提供“索引源服務”的MySQL數據庫進行了分開。監聽3306端口的MySQL提供“搜索查詢服務”,監聽3406端口的MySQL提供“索引源服務”。

            (4)、“主索引+增量索引”更新方式:
            一般網站的特征:信息發布較為頻繁;剛發布完的信息被編輯、修改的可能性大;兩天以前的老帖變動性較小。
            基于這個特征,我設計了Sphinx主索引和增量索引。對于前天17:00之前的記錄建立主索引,每天凌晨自動重建一次主索引;對于前天17:00之后到當前最新的記錄,間隔3分鐘自動重建一次增量索引。

            (5)、“Ext3文件系統+tmpfs內存文件系統”相結合:
            為了避免每3分鐘重建增量索引導致磁盤IO較重,從而引起系統負載上升,我將主索引文件創建在磁盤,增量索引文件創建在tmpfs內存文件系統“/dev/shm/”內?!?dev/shm/”內的文件全部駐留在內存中,讀寫速度非???。但是,重啟服務器會導致“/dev/shm/”內的文件丟失,針對這個問題,我會在服務器開機時自動創建“/dev/shm/”內目錄結構和Sphinx增量索引。

            (6)、中文分詞詞庫:
            我根據“自整理的中文分詞庫”+“搜狗拼音輸入法細胞詞庫”+“LibMMSeg高頻字庫”+... 綜合整理成一份中文分詞詞庫,出于某些考慮暫不提供。你可以使用LibMMSeg自帶的中文分詞詞庫。
            [文章作者:張宴 本文版本:v1.0 最后修改:2008.07.24 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/post/359/]

            寫了一個shell腳本,可以在同一臺Linux服務器的不同端口,運行多個MySQL服務的情況下,快捷啟動、停止、重啟、殺死指定端口的MySQL進程。

          vi /usr/local/bin/mysql.sh

            輸入以下內容(因各服務器的MySQL配置不同,可能需要修改的部分已用紅色標注):
          #!/bin/sh

          mysql_port=$2
          mysql_username="root"
          mysql_password="123456"

          function_start_mysql()
          {
              printf "Starting MySQL...\n"
              /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/mysql/${mysql_port}/my.cnf 2>&1 > /dev/null &
          }

          function_stop_mysql()
          {
              printf "Stoping MySQL...\n"
              /usr/local/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -h localhost -P ${mysql_port} shutdown
          }

          function_restart_mysql()
          {
              printf "Restarting MySQL...\n"
              function_stop_mysql
              function_start_mysql
          }

          function_kill_mysql()
          {
              kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep ${mysql_port} | awk '{printf $2}')
              kill -9 $(ps -ef | grep 'libexec/mysqld' | grep ${mysql_port} | awk '{printf $2}')
          }

          if [ "$1" = "start" ]; then
              function_start_mysql
          elif [ "$1" = "stop" ]; then
              function_stop_mysql
          elif [ "$1" = "restart" ]; then
              function_restart_mysql
          elif [ "$1" = "kill" ]; then
              function_kill_mysql
          else
              printf "Usage: mysql.sh {start|stop|restart|kill}\n"
          fi


            賦予腳本可執行權限:
          chmod +x /usr/local/bin/mysql.sh


            腳本執行方法:
          mysql.sh start 3306
          mysql.sh stop 3306
          mysql.sh restart 3306
          mysql.sh kill 3306

          Tags: , , , ,
            1、通過鏡像站
            http://mirror.optus.net/sourceforge/
            http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/

            2、通過Google代理(雖然是針對手機上網的,但是PC上的瀏覽器也可以訪問)
            http://www.google.com/gwt/n
            http://www.google.com/gwt/n?u=http%3A%2F%2Fsourceforge.net

            3、找國外代理服務器

            4、名稱以F開頭的某軟件(不便公布)
            [文章作者:張宴 本文版本:v1.1 最后修改:2008.09.09 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/post/357/]

            鑒于國內外還沒有人撰寫如何安裝Memcache_engine的文章,于是,我根據自己的編譯安裝步驟,寫下此文。

            Memcache_engine是一個MySQL 5.1數據庫的存儲引擎,它能夠讓用戶通過標準的SQL語句(SELECT/UPDATE/INSERTE/DELETE)訪問Memcached(還支持新浪的Memcachedb、dbcached)中存放的數據。

            限制:
            1、Memcache表必須有主鍵。
            2、只能使用主鍵去查詢,即只能使用SELECT ... FROM ... WHERE id = ... 方式去查詢。
            3、不支持自增ID。

            安裝與使用:
            1、編譯安裝memcache_engine的步驟:
          cd /tmp
          wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.26-rc.tar.gz/from/http://mirror.x10.com/mirror/mysql/
          tar zxvf mysql-5.1.26-rc.tar.gz
          #安裝、配置MySQL的步驟省略,注意不要以靜態方式編譯安裝。

          wget http://download.tangent.org/libmemcached-0.23.tar.gz
          tar zxvf libmemcached-0.23.tar.gz
          cd libmemcached-0.23/
          ./configure --prefix=/usr/local/memcache_engine
          make
          make install
          cd ../

          wget http://xmlsoft.org/sources/libxml2-2.6.32.tar.gz
          tar zxvf libxml2-2.6.32.tar.gz
          cd libxml2-2.6.32/
          ./configure --prefix=/usr/local/memcache_engine
          make
          make install
          cd ../

          wget http://download.tangent.org/libxmlrow-0.2.tar.gz
          tar zxvf libxmlrow-0.2.tar.gz
          cd libxmlrow-0.2/
          export PKG_CONFIG_PATH=/usr/local/memcache_engine/lib/pkgconfig/
          ./configure --prefix=/usr/local/memcache_engine
          make
          make install
          cd ../

          wget http://download.tangent.org/memcache_engine-0.7.tar.gz
          tar zxvf memcache_engine-0.7.tar.gz
          cd memcache_engine-0.7/
          sed -i "s#uint16_t#uint32_t#g" ./src/ha_memcache.cc
          export PKG_CONFIG_PATH=/usr/local/memcache_engine/lib/pkgconfig/
          ./configure --prefix=/usr/local/memcache_engine --with-mysql=/tmp/mysql-5.1.26-rc
          make
          make install
          cd ../

            注意:紅色標記部分為MySQL 5.1.22以上版本的源碼路徑。
            [文章+程序 作者:張宴 本文版本:v1.0 最后修改:2008.07.01 轉載請注明原文鏈接:http://blog.www.lukangtou.cn/post/356/]

            MySQL在高并發連接、數據庫記錄數較多的情況下,SELECT ... WHERE ... LIKE '%...%'的全文搜索方式不僅效率差,而且以通配符%和_開頭作查詢時,使用不到索引,需要全表掃描,對數據庫的壓力也很大。MySQL針對這一問題提供了一種全文索引解決方案,這不僅僅提高了性能和效率(因為MySQL對這些字段做了索引來優化搜索),而且實現了更高質量的搜索。但是,至今為止,MySQL對中文全文索引無法正確支持。

            中文與西方文字如英文的一個重要區別在于,西方文字以單詞為單位,單詞與單詞之間以空格分隔。而中文以字為單位,詞由一個或多個字組成,詞與詞之間沒有空格分隔。當試圖在一個含有中文字符的字段中使用全文搜索時,不會得到正確的結果,原因在于中文中沒有像英文空格那樣對詞定界,不能以空格作為分割,對中文詞語進行索引。

            引用《MySQL 5.1參考手冊》中的一段話:
          引用
          12.7. 全文搜索功能(http://dev.mysql.com/doc/refman/5.1/zh/functions.html
          ● MySQL支持全文索引和搜索功能。MySQL中的全文索引類型FULLTEXT的索引。FULLTEXT 索引僅可用于 MyISAM 表;他們可以從CHAR、 VARCHAR或TEXT列中作為CREATE TABLE語句的一部分被創建,或是隨后使用ALTER TABLE 或 CREATE INDEX被添加。對于較大的數據集,將你的資料輸入一個沒有FULLTEXT索引的表中,然后創建索引, 其速度比把資料輸入現有FULLTEXT索引的速度更為快。

          ● FULLTEXT分析程序會通過尋找某些分隔符來確定單詞的起始位置和結束位置,例如' ' (間隔符號)、 , (逗號)以及 . (句號 )。假如單詞沒有被分隔符分開,(例如在中文里 ), 則 FULLTEXT 分析程序不能確定一個詞的起始位置和結束位置。為了能夠在這樣的語言中向FULLTEXT 索引添加單詞或其它編入索引的術語,你必須對它們進行預處理,使其被一些諸如"之類的任意分隔符分隔開。

          ● 諸如漢語和日語這樣的表意語言沒有自定界符。因此, FULLTEXT分析程序不能確定在這些或其它的這類語言中詞的起始和結束的位置。


            國內已有的MySQL中文全文索引解決方案有兩個:一是海量科技的MySQL5.0.37--LinuxX86-Chinese+,二是hightman開發的mysql-5.1.11-ft-hightman,兩者都是基于中文分詞技術,對中文語句進行拆分。但是,兩者都有弊端,一是不支持64位操作系統;二是對修改了MySQL源碼,只支持某一MySQL版本,不便于跟進新版本;三是詞庫不能做到很大很全,對于專業性質較強的數據庫內容(例如搜索“頤和園路東口”、“清華東路西口”等公交站點,“萊鎮香格里”、“碧海云天”等樓盤名稱),基于中文分詞的全文索引經常搜索不出來任何內容,即使添加分詞詞庫,也不會很全面。

            由于精準全文查詢的需要,我借鑒了二元交叉切分算法的思想,用自創的“三字節交叉切分算法”,寫出了這款“MySQL中文全文索引插件──mysqlcft 1.0.0”。由于開發時間倉促,難免存在未發現的問題,這將后續的版本中不斷完善。對于百萬條記錄的MySQL表進行全文檢索,mysqlcft已經夠用。



            Mysqlcft 網址:http://code.google.com/p/mysqlcft/

            Mysqlcft 作者:張宴



            一、MySQL中文全文索引插件mysqlcft的特點:
            1、優點:
           ?、?、精準度很高:采用自創的“三字節交叉切分算法”,對中文語句進行分割,無中文分詞詞庫,搜索精準度遠比中文分詞算法高,能達到LIKE '%...%"的準確率。
           ?、?、查詢速度快:查詢速度比LIKE '%...%"搜索快3~50倍,文章末尾有測試結果;
           ?、?、標準插件式:以MySQL 5.1全文索引的標準插件形式開發,不修改MySQL源代碼,不影響MySQL的其他功能,可快速跟進MySQL新版本;
           ?、?、支持版本多:支持所有的MySQL 5.1 Release Candidate版本,即MySQL 5.1.22 RC~最新的MySQL 5.1.25 RC;
           ?、?、支持字符集:支持包括GBK、GB2312、UTF-8、Latin1、BIG5在內的MySQL字符集(其他字符集沒有測試過);
           ?、?、系統兼容好:具有i386和x86_64兩個版本,支持32位(i386)和64位(x86_64)CPU及Linux系統;
           ?、?、適合分布式:非常適合MySQL Slave分布式系統架構,無詞庫維護成本,不存在詞庫同步問題。

            2、缺點:
           ?、?、mysqlcft中文全文索引只適用于MyISAM表,因為MySQL只支持對MyISAM表建立FULLTEXT索引;
           ?、?、MySQL不能靜態編譯安裝,否則無法安裝mysqlcft插件;
           ?、?、基于“三字節交叉切分算法”的索引文件會比海量、ft-hightman等基于“中文分詞算法”的索引文件稍大,但不是大很多。根據我的測試,mysqlcft全文索引的.MYI索引文件是.MYD數據文件的2~5倍。



            二、mysqlcft的核心思想──“三字節交叉切分算法”

            點擊在新窗口中瀏覽此圖片

            注:本文以0~7數字序號代表“英文”、“數字”和“半個漢字”,以便說明。
            1、按三字節對中文語句進行切分,建立全文索引:
            例如:“全文索引”或“1臺x光機”四個字會被交叉分拆為6份,建立反向索引:
            012  123  234  345  456  567

            2、按三字節對搜索的關鍵字進行切分,在全文索引中找出對應信息:
            例①:搜索關鍵字“文索”,用數字序號表示就是“2~5”,那么它將被切分成:
            234  345
            這樣,就與全文索引對上了。

            例②:搜索關鍵字“x光機”,用數字序號表示就是“3~7”,那么它將被切分成:
            345  456  567
            這樣,也與全文索引對上了。

            例③:搜索關鍵字“1臺 光機”,用數字序號表示就是“0~2”和“4~7”,那么它將被切分成:
            012  456  567
            這樣,多關鍵字搜索也與全文索引對上了。
          分頁: 9/31 第一頁 上頁 4 5 6 7 8 9 10 11 12 13 下頁 最后頁 [ 顯示模式: 摘要 | 列表 ]
          在线精品国产在线视频