Sphinx+Mysql+Php 12亿DNS数据秒查
最近得到一个接近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 dnsfields 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 asdDEPRECATED: Do not call this method or, even better, use SphinxQL instead of anAPIQuery 'asd ' retrieved 1000 of 209273 matches in 0.007 secQuery stats: 'asd' found 209291 times in 209273 documentsMatches:1. doc_id=20830, weight=12. doc_id=63547, weight=13. doc_id=96147, weight=14. doc_id=1717000, weight=15. doc_id=2213385, weight=16. doc_id=3916825, weight=17. doc_id=3981791, weight=18. doc_id=5489598, weight=19. doc_id=9348383, weight=110. doc_id=18194414, weight=111. doc_id=18194415, weight=112. doc_id=18195126, weight=113. doc_id=18195517, weight=114. doc_id=18195518, weight=115. doc_id=18195519, weight=116. doc_id=18195520, weight=117. doc_id=18195781, weight=118. doc_id=18195782, weight=119. doc_id=18200301, weight=120. doc_id=18200303, weight=1
进行了测试,发现速度真的很快,写了一个PHP脚本进行调用
<?phpinclude '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;?>
基本实现了秒查!,最后输出的时间只花掉了0!
123.125.104.176:w-176.service.weibo.com123.125.104.178:w-178.service.weibo.com123.125.104.179:w-179.service.weibo.com123.125.104.207:w-207.service.weibo.com123.125.104.208:w-208.service.weibo.com123.125.104.209:w-209.service.weibo.com123.125.104.210:w-210.service.weibo.com202.106.169.235:staff.weibo.com210.242.10.56:weibo.com.tw218.30.114.174:w114-174.service.weibo.com219.142.118.228:staff.weibo.com60.28.2.221:w-221.hao.weibo.com60.28.2.222:w-222.hao.weibo.com60.28.2.250:w-222.hao.weibo.com61.135.152.194:sina152-194.staff.weibo.com61.135.152.212:sina152-212.staff.weibo.com65.111.180.3:pr1.cn-weibo.com160.34.0.155:srm-weibo.us2.cloud.oracle.com202.126.57.40:w1.weibo.vip.hk3.tvb.com202.126.57.41:w1.weibo.hk3.tvb.com0

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

會話劫持可以通過以下步驟實現:1.獲取會話ID,2.使用會話ID,3.保持會話活躍。在PHP中防範會話劫持的方法包括:1.使用session_regenerate_id()函數重新生成會話ID,2.通過數據庫存儲會話數據,3.確保所有會話數據通過HTTPS傳輸。

SOLID原則在PHP開發中的應用包括:1.單一職責原則(SRP):每個類只負責一個功能。 2.開閉原則(OCP):通過擴展而非修改實現變化。 3.里氏替換原則(LSP):子類可替換基類而不影響程序正確性。 4.接口隔離原則(ISP):使用細粒度接口避免依賴不使用的方法。 5.依賴倒置原則(DIP):高低層次模塊都依賴於抽象,通過依賴注入實現。

在PHPStorm中如何進行CLI模式的調試?在使用PHPStorm進行開發時,有時我們需要在命令行界面(CLI)模式下調試PHP�...

如何在系統重啟後自動設置unixsocket的權限每次系統重啟後,我們都需要執行以下命令來修改unixsocket的權限:sudo...

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

使用PHP的cURL庫發送JSON數據在PHP開發中,經常需要與外部API進行交互,其中一種常見的方式是使用cURL庫發送POST�...
