我正在尝试在我的网站上实施搜索自动完成功能。到目前为止我想出的只是一个包含搜索词(城市)的表格
city_id int(10) Auto Increment, Primary
city_name varchar(200) Index
和查询
select * from city_names where lower(city_name) like lower('my_search_term%) order by length(city_name) limit 10;
此查询返回10个包含搜索字符串的最短名称的城市,正是我需要的,但速度非常慢。我的猜测是数据库首先搜索与正则表达式匹配的所有内容,然后按长度对结果进行排序,然后选择10行。我认为最好以某种方式按长度(city_name)对数据进行预排序,以便查询在达到与正则表达式匹配的10行后停止。
所以我的问题是:
欢迎任何想法。
更新: 基于zerkms's suggestions,我做了以下内容:
latin_general_ci
。这使我摆脱了LOWER(city_name)的转换。sort_index
升序。现在我在查询中不需要任何ORDER
命令。表和查询现在看起来像:
sort_index int(10) Primary
city_name varchar(200)
city_id int(10) Auto Increment
select * from city_names where city_name like lower('my_search_term%) limit 10;
答案 0 :(得分:3)
*_ci
排序规则,则字符串比较应不区分大小写。所以应该使用city_name LIKE LOWER('term%')
。city_name
列长度(city_name, city_name_length)
索引(但有可能不会使用city_name_length
)