MySQL不使用索引(尽管FORCE INDEX)

时间:2012-04-29 17:44:32

标签: mysql sql indexing innodb

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

我想在MyISAM使用cities表格,因为InnoDB不支持FULLTEXT搜索,但我认为这不是一种方法(频繁的表崩溃,所有其他表都是InnoDB等,而MySQL 5.6 + InnoDB也开始支持FULLTEXT索引。

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

以下查询(我在不同的版本中尝试了它,没有任何JOIN,没有ORDER BYUSE INDEX,甚至FORCE INDEX,我尝试过LIKE等于(=)但另一篇文章说=更快,如果通配符只在最后,可以使用它),在EXPLAIN它总是说“使用where,使用filesort”。查询的平均时间约为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

PRIMARY上有ci.idINDEX上有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    

2 个答案:

答案 0 :(得分:3)

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

  

我试过LIKE而不是等于(=)但是另一个帖子说=更快,如果通配符只在最后,可以使用它

这是错误的。 =不支持通配符,因此会给您错误的结果。

  

或者我如何加快查询速度?

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

答案 1 :(得分:1)

查询确实使用索引,如解释输出的key字段中所示。它使用filesort的原因是order by,以及它使用的原因可能是其中一个字段(city_real,population)允许空值。