Sphinx+Mysql+Php 12億DNS數據秒查

jopen 9年前發布 | 19K 次閱讀 Sphinx 搜索引擎

    最近得到一個接近12億的全球ns節點的數據,本來想用來做一個全國通過dns反查域名然后進行全國范圍的網站收集和掃描的,后來發現網站的數量不是很準確,加上一個人的精力和財力實在難以完成這樣一個龐大的任務,就沒有做下去,只留下了這個搭建的筆記。
    文本格式,簡單的文本搜索,速度太慢,一次搜索接近花掉5-10分鐘時間,決定將其倒入數據庫進行一次優化,速度應該能提升不到,電腦上只有AMP的環境,那么就決定將其倒入到mysql中,
一開始使用Navicat進行倒入,剛好數據的格式是 ip,ns 這樣的格式,倒入了接近5個小時發現還沒有倒入到百分之一,這可是純文本格式化的時候大小為54G的數據文件啊!
    后來發現用mysql自帶的load data local infile只話了30分鐘左右,第一次導入的時候忘記新建鍵了,只好重新導入一次

mysql> load data local infile 'E:\\dns\\rite\\20141217-rdns.txt' into table dns
fields terminated by ',';
Query OK, 1194674130 rows affected, 1700 warnings (29 min 26.65 sec)
Records: 1194674130  Deleted: 0  Skipped: 0  Warnings: 1700

    因為添加了一個id字段,所以導入速度明顯下降,不過大概也只花了1個半小時左右的時間就完成了55G數據的導入。
    接著是建立索引,因為我需要的模糊查詢,所以在這里建立的是Full Text+Btree,差不多花了3天時間索引才建立完成,期間因為一不小心把mysql的執行窗口關閉了,以為就這么完蛋了,最后發現其實mysql還在后臺默默的建立索引。
    建立了索引之后發現查詢速度也就比沒有建立索引快那么一點,執行了一條

select * from ns where ns like '%weibo.com'

    花掉了210秒的時間,還是太慢了。
    然后就開始使用SPhinx來做索引提升速度,
    從官方下載了64位的SPHINX MYSQL SUPPORT的包下載地址
    接著配置配置文件,src里配置要mysql的賬號密碼

source src1
{
    sql_host        = localhost
    sql_user        = root
    sql_pass        = root
    sql_db          = ns
    sql_port        = 3306  
    sql_query       = \
        SELECT id,ip,ns from ns //這里寫上查詢語句
    sql_attr_uint       = id

然后searchd里也需要配置一下,端口和日志,pid文件的路徑配置好即可

searchd
{
    listen          = 9312
    listen          = 9306:mysql41
    log         = E:/phpStudy/splinx/file/log.log
    query_log       = E:/phpStudy/splinx/file/query.log
    pid_file        = E:/phpStudy/splinx/file/searchd.pid

然后切換到sphinx的bin目錄進行建立索引,執行

searchd test1 #test1是你source的名稱

我大概建立了不到2個小時的時間就建立完成了,
然后切換到api目錄下執行

E:\phpStudy\splinx\api>test.py asd
DEPRECATED: Do not call this method or, even better, use SphinxQL instead of an
API
Query 'asd ' retrieved 1000 of 209273 matches in 0.007 sec
Query stats:
        'asd' found 209291 times in 209273 documents
Matches:
1. doc_id=20830, weight=1
2. doc_id=63547, weight=1
3. doc_id=96147, weight=1
4. doc_id=1717000, weight=1
5. doc_id=2213385, weight=1
6. doc_id=3916825, weight=1
7. doc_id=3981791, weight=1
8. doc_id=5489598, weight=1
9. doc_id=9348383, weight=1
10. doc_id=18194414, weight=1
11. doc_id=18194415, weight=1
12. doc_id=18195126, weight=1
13. doc_id=18195517, weight=1
14. doc_id=18195518, weight=1
15. doc_id=18195519, weight=1
16. doc_id=18195520, weight=1
17. doc_id=18195781, weight=1
18. doc_id=18195782, weight=1
19. doc_id=18200301, weight=1
20. doc_id=18200303, weight=1

進行了測試,發現速度真的很快,寫了一個PHP腳本進行調用

<?php
include 'sphinxapi.php';
$conn=mysql_connect('127.0.0.1','root','root');
mysql_select_db('ns',$conn);
$sphinx = new SphinxClient();
$now=time();
$sphinx->SetServer ( '127.0.0.1', 9312 );
$result = $sphinx->query ('weibo.com', 'test1'); 
foreach($result['matches'] as $key => $val){
    $sql="select * from ns where id='{$key}'";
    $res=mysql_query($sql);
    $res=mysql_fetch_array($res);
    echo "{$res['ip']}:{$res['ns']}";

} echo time()-$now; ?></pre>

基本實現了秒查!,最后輸出的時間只花掉了0!

123.125.104.176:w-176.service.weibo.com
123.125.104.178:w-178.service.weibo.com
123.125.104.179:w-179.service.weibo.com
123.125.104.207:w-207.service.weibo.com
123.125.104.208:w-208.service.weibo.com
123.125.104.209:w-209.service.weibo.com
123.125.104.210:w-210.service.weibo.com
202.106.169.235:staff.weibo.com
210.242.10.56:weibo.com.tw
218.30.114.174:w114-174.service.weibo.com
219.142.118.228:staff.weibo.com
60.28.2.221:w-221.hao.weibo.com
60.28.2.222:w-222.hao.weibo.com
60.28.2.250:w-222.hao.weibo.com
61.135.152.194:sina152-194.staff.weibo.com
61.135.152.212:sina152-212.staff.weibo.com
65.111.180.3:pr1.cn-weibo.com
160.34.0.155:srm-weibo.us2.cloud.oracle.com
202.126.57.40:w1.weibo.vip.hk3.tvb.com
202.126.57.41:w1.weibo.hk3.tvb.com
0
</div> 來自:http://my.oschina.net/rookier/blog/406140

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!