【发布时间】:2012-03-31 19:27:57
【问题描述】:
对于具有自动完成功能的机场输入字段,目前有一个包含机场描述的表格,autocomplete_airport:
lang | description (with INDEX) | ...
-----+----------------------------------------------------+----
pt | New York - John F Kennedy (JFK), Estados Unidos | ...
pt | Nova Iorque - John F Kennedy (JFK), Estados Unidos | ...
...
自动完成功能适用于单个单词。因此,当用户输入“yor”时,会出现“new york”(如果在 LIMIT 中)。该查询目前的工作方式如下:
SELECT * FROM autocomplete_airport WHERE lang = "pt"
AND (description LIKE "%(yor)%"
OR description LIKE "yor%"
OR description LIKE "% yor%")
ORDER BY description
LIMIT 15
现在我想知道如何加快速度。一种想法是创建以下数据库结构,其中包含表autocomplete_airport 和autocomplete_airport_word:
id | lang | description (with INDEX) | ...
-----+------+----------------------------------------------------+----
123 | pt | New York - John F Kennedy (JFK), Estados Unidos | ...
124 | pt | Nova Iorque - John F Kennedy (JFK), Estados Unidos | ...
...
word (with INDEX) | autocomplete_airport_id
------------------+------------------------
New | 123
York | 123
John | 123
F | 123
Kennedy | 123
JFK | 123
...
那么 SELECT 只需要在字符串的开头进行搜索:
SELECT DISTINCT autocomplete_airport.*
FROM autocomplete_airport
INNER JOIN autocomplete_airport_word
ON autocomplete_airport.id = autocomplete_airport_word.autocomplete_airport_id
WHERE lang = "pt"
AND word LIKE "yor%"
ORDER BY description
LIMIT 15
这种新结构值得麻烦吗?它真的会加快速度吗?有没有更简单的方法?
更新
刚刚注意到单词表有一个缺陷。结果:搜索“纽约”不会给出任何结果。什么应该起作用:
term (with INDEX) | autocomplete_airport_id
------------------------------------------------+------------------------
New York - John F Kennedy (JFK), Estados Unidos | 123
York - John F Kennedy (JFK), Estados Unidos | 123
John F Kennedy (JFK), Estados Unidos | 123
F Kennedy (JFK), Estados Unidos | 123
Kennedy (JFK), Estados Unidos | 123
(JFK), Estados Unidos | 123
Estados Unidos | 123
Unidos | 123
JFK | 123
【问题讨论】:
标签: mysql performance search