我有一个表单,它使用autosuggest在数据库中搜索大约15k条记录(存储地址)。我正在使用PHP(开发时为5.5,prod为5.4)和MySQL。我的搜索算法以这样的方式工作:
brand city
。brand
,city
。%brand%
或%city%
。我知道,这不是那么有效,但它适用于< 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
现在我想,我应该为品牌,城市和街道创建单独的列。我是对的吗?
答案 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 …
并执行它)。