Sphinx和PHP

时间:2015-06-10 08:34:15

标签: php mysql sphinx

情况如下:

我的数据库中有一个大表--3.6 GB和1,7M行。从表中选择限制和偏移非常慢并且经常导致错误504.表是MyISAM,具有多个索引并且将被更新。

这就是为什么我决定使用Sphinx列出表的内容 - 在某些情况下没有查询(所有行),在某些情况下使用查询 - 它就像一个魅力。速度惊人。

但这是问题 - 没有查询只返回前1000个结果。即使我使用$this->SetLimits(41, 24);来调用它,也应该返回ID为9841008的结果,但我得到的最后一个结果是ID为1,000。我尝试更改/etc/sphinxsearch/sphinx.conf中的值,重新启动服务,但没有成功。 还有,这是一个好主意吗?我的意思是,它会明显减慢性能吗?有关如何做到这一点的任何建议吗?

这是另一个问题:

在我的sphinx.conf我选择了我想用于搜索/订单的列,它们都出现在[matches]部分。由于我不使用它们,它们只占用内存并且(我猜)在某种程度上降低了性能。我只在我的应用程序中使用id。是否可以按这些列进行搜索/排序,但将其从[matches]中排除?

我的sphinx.conf

source test {

  type          = mysql

  sql_host      = localhost
  sql_user      = root
  sql_pass      = password
  sql_db        = database
  sql_port      = 3306

  sql_query     = \
  SELECT id, name,  UNIX_TIMESTAMP(date) as date, views, rating \
  FROM table \
  WHERE active = 1

  sql_field_string      = name
  sql_attr_timestamp    = date
  sql_attr_uint         = views
  sql_attr_uint         = rating

  sql_query_info        = SELECT * FROM table WHERE id=$id

}

index test {

  source            = test
  path              = /var/lib/sphinxsearch/data/test
  docinfo           = extern
  charset_type      = utf-8

}

searchd {

  listen            = 9312
  log               = /var/log/sphinxsearch/searchd.log
  query_log         = /var/log/sphinxsearch/query.log
  read_timeout      = 5
  max_children      = 30
  pid_file          = /var/run/sphinxsearch/searchd.pid
  max_matches       = 10000 # I tried changing this to 10,000 - no result
  seamless_rotate   = 1
  preopen_indexes   = 1
  unlink_old        = 1
  binlog_path       = /var/lib/sphinxsearch/data

}

2 个答案:

答案 0 :(得分:2)

这是因为每次查询最大匹配设置也是如此,默认为1000.

在sphinx.conf中你可以设置像

这样的东西
while ($row = $result->fetch_assoc()) {
    $data[] = $row;
}

或者,将max_matches添加到您的查询

max_matches = 10000 
  

请注意,有两个地方强制执行max_matches限制。   每个查询限制由此API调用控制,但也存在   每个服务器限制由配置文件中的max_matches设置控制。   为防止滥用RAM,服务器将不允许设置每个查询   限制高于每服务器限制。

答案 1 :(得分:0)

对于第二部分,请查看->SetSelect()函数。