Sphinx,单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

基于以上几点,我设计出了这套搜索引擎架构。在生产环境运行了一周,效果非常不错。有时间我会专为配合Sphinx搜索引擎,开发一个逻辑简单、速度快、占用内存低、非表锁的MySQL存储引擎插件,用来代替MyISAM引擎,以解决MyISAM存储引擎在频繁更新操作时的锁表延迟问题。另外,分布式搜索技术上已无任何问题。

一、搜索引擎架构设计:

1、搜索引擎架构图:

  sphinx.png

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查询每秒只能处理几十次到几百次:

  mysqlselect.png

③、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自带的中文分词词库。

二、MySQL+Sphinx+SphinxSE安装步骤:

1、安装python支持(以下针对CentOS系统,其他Linux系统请使用相应的方法安装)

yum install -y python python-devel

2、编译安装LibMMSeg(LibMMSeg是为Sphinx全文搜索引擎设计的中文分词软件包,其在GPL协议下发行的中文分词法,采用Chih-Hao Tsai的MMSEG算法。LibMMSeg在本文中用来生成中文分词词库。)

以下压缩包“sphinx-0.9.8-rc2-chinese.zip”中包含mmseg-0.7.3.tar.gz、sphinx-0.9.8-rc2.tar.gz以及中文分词补丁。

download.gif下载文件 (已下载 7 次)

unzip sphinx-0.9.8-rc2-chinese.zip

tar zxvf mmseg-0.7.3.tar.gz

cd mmseg-0.7.3/

./configure

make

make install

cd ../

3、编译安装MySQL 5.1.26-rc、Sphinx、SphinxSE存储引擎

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

tar zxvf sphinx-0.9.8-rc2.tar.gz

cd sphinx-0.9.8-rc2/

patch -p1 < ../sphinx-0.98rc2.zhcn-support.patch

patch -p1 < ../fix-crash-in-excerpts.patch

cp -rf mysqlse ../mysql-5.1.26-rc/storage/sphinx

cd ../

cd mysql-5.1.26-rc/

sh BUILD/autorun.sh

./configure --with-plugins=sphinx --prefix=/usr/local/mysql-search/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile

make && make install

cd ../

cd sphinx-0.9.8-rc2/

CPPFLAGS=-I/usr/include/python2.4

LDFLAGS=-lpython2.4

./configure --prefix=/usr/local/sphinx --with-mysql=/usr/local/mysql-search

make

make install

cd ../

mv /usr/local/sphinx/etc/sphinx.conf /usr/local/sphinx/etc/sphinx.conf.old

第二章第3节之后的正文内容不予公布,全文的目录如下(共24页):

  doc1.gif

  doc2.gif

  doc3.gif

sphinx mysql存储引擎_基于Sphinx+MySQL的千万级数据全文检索(搜索引擎)架构设计...相关推荐

  1. mysql 储存引擎_详解mysql存储引擎的标准

    浅谈选择mysql存储引擎的标准 主要存储引擎的介绍 1.InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的短期(short-lived)事务.除非有非常特别的原因 ...

  2. mysql BDB存储引擎_直接访问mysql的BDB存储引擎

    我们知道BDB是一种嵌入式的数据库,存取效率比mysql高,但是管理起来没有mysql方便,在分布式应用中同步也是一个问题. 恰好mysql是支持用BDB作为存储引擎的(5.1之后就不直接支持了,因为 ...

  3. mysql+如何开发存储引擎_干货!MySQL 的 InnoDB 存储引擎是怎么设计的?

    MySQL 里还有什么其他成员呢? 对于 MySQL,要记住.或者要放在你随时可以找到的地方的两张图,一张是 MySQL 架构图,另一张则是 InnoDB 架构图: 遇到问题,或者学习到新知识点时,就 ...

  4. MySQL存储引擎简介——《高性能MySQL》

    在文件系统中,Mysql将每个数据库(也可以称之为schmea)保存为数据目下的一个子目录.数据库和表的定义都使用文件系统的目录和文件来保存,大小写敏感和具体的平台密切相关.在Windows中,大小写 ...

  5. mysql 高性能引擎_《高性能MySQL》笔记1-MySQL架构与引擎

    ## 架构 ![](/img/pic/2019062020293149827_png_583_418_76732) > MySQL架构图 MySQL的架构分为三层. 第一层只负责提供服务,包括链 ...

  6. mysql存储引擎查看语句,在MySQL中,可以使用(??)语句查看MySQL服务器采用的默认存储引擎...

    在MySQL中,可以使用(??)语句查看MySQL服务器采用的默认存储引擎 答:SHOW VARIABLES; 名词解释:顾姑冠 答:蒙古族已婚妇女的首服,由帽子.冠体.披幅.系带.冠顶.羽毛五部分组 ...

  7. mysql新闻发布_基于PHP+mysql实现新闻发布系统的开发

    新闻发布系统 1. 系统简介 一个简单的新闻系统,包含了四个功能,增删改查,利用PHP语言,结合了MySQL数据库,开发工具用的是Dreamweaver. 2.数据库设计 -- 数据库: `newsd ...

  8. jsp mysql 推荐算法_基于jsp+mysql+Spring+mybatis的SSM协同过滤音乐推荐管理系统(个性化推荐)...

    运行环境: 最好是java jdk 1.8,我们在这个平台上运行的.其他版本理论上也可以. IDE环境: Eclipse,Myeclipse,IDEA都可以 tomcat环境: 最好是Tomcat 7 ...

  9. 基于vb的mysql管理系统代码_基于VB+MySQL的简单图书管理系统

    代码片段和文件信息 属性            大小     日期    时间   名称 ----------- ---------  ---------- -----  ---- 文件        ...

最新文章

  1. 实验电路的放大器伴侣:LMV358
  2. Windows中现在有独立的Linux文件夹系统
  3. 如何查看夜神模拟器的端口
  4. Linux查看某个进程的线程
  5. php-cgi导致的502 Bad Gateway错误
  6. 2019-01-02
  7. Linux系统编程——孤儿进程模拟及分析
  8. java如何实取随机数_java - 如何在Kotlin中获取随机数?
  9. dijkstra最短路径算法视频_Dijkstra最短路径算法
  10. Atitit 开发2d游戏的技术选型attilax总结
  11. matlab精确重心法选址,重心法选址问题资料.ppt
  12. Python | MD5爆破及Base64/Base32爆破解密脚本
  13. 网站木马检测_网站建立检测劫持,网站建立检测劫持如何操作,详细步骤
  14. 组织分解结构(Organizational Breakdown Structure OBS)
  15. html代码表格服装尺寸,HTML - 表格单元尺寸
  16. 一张图片放两个二维码_两个方法教你找到一张图片的高清版
  17. 【深度学习】实时人眼 瞳孔追踪 系统
  18. 美团新用户0.99充10元话费,秒到账,不实名不绑卡,超简单!
  19. 微信公众号的代码块插入,及一键排版
  20. 从《欲望都市》到《绝望主妇》 美剧的疯狂

热门文章

  1. 什么是跨域及跨域请求资源的方法?
  2. $(function() {})
  3. 研究笔记:iOS中使用WebViewProxy拦截URL请求
  4. shell 产生随机数的多种方法
  5. 采购订单单价金额屏蔽
  6. cisco 交换机vlan-trunk的配置详解及应用实例:
  7. Linux下Socket网络编程
  8. 使用AIR运行另外的程序。
  9. 1109. 航班预订统计
  10. 像程序员一样思考_如何像程序员一样思考-解决问题的经验教训