sphinx mysql 数据源_3.7.SQL 数据源 (MySQL, PostgreSQL) - Sphinx 0.9.9/Coreseek 3.2 参考手册...

本文详细介绍了Sphinx/Coreseek如何使用SQL数据源,包括连接数据库、执行预查询、主查询、后查询等步骤,以及区段查询技术,旨在优化大型表的索引过程,避免锁定和内存浪费问题。同时,解释了后查询与索引后查询的区别,确保索引构建的完整性和数据库连接的管理。
摘要由CSDN通过智能技术生成

对于所有的基于SQL驱动,建立索引的过程如下:

连接到数据库;

执行预查询 (参见Section9.1.11, “sql_query_pre”) ,以便完成所有必须的初始设置,比如为MySQL连接设置编码;

执行主查询 (参见Section9.1.12, “sql_query”) ,其返回的的数据将被索引;

执行后查询 (seeSection9.1.23, “sql_query_post”) ,以便完成所有必须的清理工作;

关闭到数据库的连接;

对短语进行排序 (或者学究一点, 索引类型相关的后处理);

再次建立到数据库的连接;

执行后索引查询 (参见Section9.1.24, “sql_query_post_index”) i,以便完成所有最终的清理善后工作;

再次关闭到数据库的连接.

大多数参数是很直观的,例如数据库的用户名、主机、密码。不过,还有一些细节上的问题需要讨论。

区段查询

索引系统需要通过主查询来获取全部的文档信息,一种简单的实现是将整个表的数据读入内存,但是这可能导致整个表被锁定并使得其他操作被阻止(例如:

在MyISAM格式上的INSERT操作),同时,将浪费大量内存用于存储查询结果,诸如此类的问题吧。

为了避免出现这种情况,Sphinx/Coreseek支持一种被称为区段查询的技术. 首先,Sphinx/Coreseek从数据库中取出文档ID的最小值和最大值,将由最大值和最小值定义自然数区间分成若干份,一次获取数据,建立索引。现举例如下:

Example1.区段查询示例:

# in sphinx.conf

sql_query_range= SELECT MIN(id),MAX(id) FROM documents

sql_range_step = 1000

sql_query = SELECT * FROM documents WHERE id>=$start AND id<=$end

如果这个表(documents)中,字段ID的最小值和最大值分别是1 和2345,则sql_query将执行3次:

将$start替换为1,并且将$end替换为 1000;

将$start替换为1001,并且将$end替换为 2000;

将$start替换为2001,并且将$end替换为 2345.

显然,这对于只有2000行的表,分区查询与整个读入没有太大区别,但是当表的规模扩大到千万级(特别是对于MyISAM格式的表),分区区段查询将提供一些帮助。

后查询(sql_post)vs.索引后查询(sql_post_index)

后查询和索引后查询的区别在于,当Sphinx获取到全部文档数据后,立即执行后查询,但是构建索引的过程仍然may因为某种原因失败。在另一方面,当索引后查询被执行时,可以理所当然的认为索引已经成功构造完了。因为构造索引可能是个漫长的过程,因此对与数据库的连接在执行后索引操作后被关闭,在执行索引后操作前被再次打开。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值