2

我需要使用 PHP 和 jQuery 进行实时搜索,以从两个表cities(几乎 3M 行)和countries(几百行)中选择城市和国家。

有一段时间我在考虑使用不支持搜索的MyISAM表,但是决定这不是一种方法(频繁的表崩溃,所有其他表都是等等,并且 MySQL 5.6+也开始支持索引)。citiesInnoDBFULLTEXTInnoDBInnoDBFULLTEXT

所以,现在我仍然使用 MySQL 5.1,因为大多数城市只包含一个单词或最多 2-3 个单词,但是例如“New York”——如果他们的意思是“New York”,大多数人不会搜索“York” . 所以,我只是在列上放了一个索引city_real(这是一个 varchar)。

以下查询(我在不同的版本中尝试过,没有任何JOIN和没有ORDER BY,有USE INDEX甚至有FORCE INDEX,我试过用 LIKE 代替等于(=)但另一篇文章说 = 更快,如果通配符只在最后,没关系使用它),EXPLAIN它总是说“使用哪里,使用文件排序”。查询的平均时间约为 4 秒,您必须承认这对于实时搜索来说有点慢(用户在文本框中输入并查看城市和国家/地区的建议)......

实时搜索(jQuery ajax)搜索用户是否输入了至少 3 个字符...

SELECT ci.id, ci.city_real, co.country_name FROM cities ci LEFT JOIN countries co ON(ci.country_id=co.country_id) WHERE city_real='cit%' ORDER BY population DESC LIMIT 5

有一个PRIMARYonci.id和一个INDEXon ci.city_real。任何想法为什么 MySQL 不使用索引?或者我怎样才能加快查询速度?或者我应该/不应该在哪里设置一个INDEX

非常感谢您的帮助!


这是解释输出

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  ci  range   city_real   city_real   768 NULL    1250    Using where; Using filesort
1   SIMPLE  co  eq_ref  PRIMARY PRIMARY 6   fibsi_1.ci.country_id   1    
4

2 回答 2

3

你应该使用WHERE city_real LIKE 'cit%',而不是WHERE city_real='cit%'

我试过用 LIKE 代替等于 (=) 但另一篇文章说 = 更快,如果通配符只在最后,可以使用它

这是错误的。=不支持通配符,所以它会给你错误的结果。

或者我怎样才能加快查询速度?

country_id确保在两个表中都有索引。EXPLAIN SELECT ...如果您需要进一步的帮助,请发布输出。

于 2012-04-29T17:47:01.827 回答
1

key查询确实使用了在解释输出字段中看到的索引。它使用文件排序的原因是 order by,它使用 where 的原因可能是字段之一(city_real、population)允许空值。

于 2012-04-30T18:25:17.690 回答