在autosuggest期间缓存大约15k记录

时间:2014-03-24 21:34:29

标签: php mysql search caching kohana

我有一个表单,它使用autosuggest在数据库中搜索大约15k条记录(存储地址)。我正在使用PHP(开发时为5.5,prod为5.4)和MySQL。我的搜索算法以这样的方式工作:

  1. 假设查询:brand city
  2. 对关键字进行查询:brandcity
  3. 搜索数据库%brand%%city%
  4. 合并结果,并按工资对其进行排序(如果两个数组中都有任何记录 - 其增量的工资)。
  5. 切片结果为10。
  6. 将它们发回给客户。
  7. 我知道,这不是那么有效,但它适用于< 1k记录。我尝试了APC和memcached,但是有了这么多数据,我收到了内存泄漏。

    您有什么想法,我该如何改进我的搜索引擎? 提前谢谢。

    编辑:

    示例查询:

    SELECT `store`.`id` AS `id`, `store`.`user_id` AS `user_id`, `store`.`name` AS `name`, `store`.`tags` AS `tags`, `store`.`is_reported` AS `is_reported`
      FROM `stores` AS `store`
      WHERE `name` LIKE '%żabka%'
      ORDER BY `store`.`name` ASC
    

    表格结构:

    CREATE TABLE IF NOT EXISTS `stores` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `user_id` int(11) unsigned NOT NULL DEFAULT '0',
      `name` varchar(250) COLLATE utf8_polish_ci NOT NULL,
      `tags` varchar(250) COLLATE utf8_polish_ci NOT NULL,
      `is_reported` int(1) unsigned NOT NULL,
      PRIMARY KEY (`id`),
      KEY `id` (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=11957 ;
    

    一个示例行:

      

    11954 | 0 | Zielony市场 - ul。 Geodetów76,07-200Wyszków| ul。,Geodetów,76,07-200,Wyszków| 0

    现在我想,我应该为品牌,城市和街道创建单独的列。我是对的吗?

1 个答案:

答案 0 :(得分:0)

扩展我以前的评论,听起来你可能会在这里做错了多次。

我建议像这样尝试(在name列上设置适当的索引后,如果这是您要搜索的唯一列):

SELECT foo, bar, baz
FROM stores
WHERE name LIKE '%brand%' OR name LIKE '%city%'
ORDER BY (name LIKE '%brand%') + (name LIKE '%city%') DESC, name ASC
LIMIT 10

ORDER BY中两个值的总和将按name列中找到的搜索词的数量对所有匹配记录进行排名 - 在此上下文中,MySQL将会对待true为1,false为0,因此如果两个LIKE匹配找到匹配,则总和将为2,只有一个匹配为1.按商店名称按字母顺序排序仅在之后发生,因为找到的匹配数具有更高的优先级对于记录的相关性。

给它一个去看看它是如何做的(不要忘记索引);如果性能不佳,那么请编辑您的问题以向我们展示此查询的EXPLAIN语句(通过将EXPLAIN放在查询前面EXPLAIN SELECT …并执行它)。