任何人都可以用简单的话解释如何使用
Sphinx这样的全文服务器?在纯sql中,可以使用这样的SQL查询来搜索文本中的某些关键字:
select * from items where name like '%keyword%';
但是在各种Sphinx插件生成的配置文件中,我看不到任何这样的查询.它们包含sql语句,如下所示,似乎将搜索划分为不同的ID组:
SELECT (items.id * 5 + 1) AS id,... WHERE items.id >= $start AND items.id <= $end GROUP BY items.id .. SELECT * FROM items WHERE items.id = (($id - 1) / 5)
解决方法
倒数索引是您的问题的答案:
http://en.wikipedia.org/wiki/Inverted_index
现在,当您通过sphinx运行SQL查询时,它从数据库中获取数据并构造反向索引,它在Sphinx中就像一个哈希表,其中key是一个32位整数,它使用crc32(word)计算,值为具有该单词的documentID的列表.
这使得它超快.
现在你可以争辩说,即使是数据库也可以创建一个类似的结构,使搜索更加快速.但最大的区别是,Sphinx / Lucene / Solr索引就像一个单表数据库,不需要关系查询(JOIN)[从MysqL性能博客]的支持.请记住,索引通常只在于支持搜索,而不是数据的主要来源.因此,您的数据库可能处于“第三种正常形式”,但是索引将被完全解除归一化,并且主要仅包含要搜索的数据.
另一个可能的原因通常是数据库遭受内部分段,他们需要在巨大的请求上执行太多的半随机I / O任务.
这意味着,例如,考虑到数据库的索引架构,查询导致索引,从而导致数据.如果要恢复的数据广泛传播,结果将需要很长时间,这似乎是数据库中发生的情况.
编辑:还可以查看cpp文件的源代码,如searchd.cpp等,用于真正的内部实现,我想你只是看到了PHP包装器.