【问题标题】:MySQL not using Index (despite FORCE INDEX)MySQL 不使用索引(尽管 FORCE INDEX)
【发布时间】:2012-04-29 17:44:31
【问题描述】:

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

有一小会儿,我想为cities 使用MyISAM 表,因为InnoDB 不支持FULLTEXT 搜索,但决定这不是一种方法(经常表崩溃,所有其他表是 InnoDB 等,并且在 MySQL 5.6+ 中,InnoDB 也开始支持 FULLTEXT 索引)。

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

以下查询(我在不同的版本中尝试过,没有任何JOIN 和没有ORDER BY,使用USE INDEX 甚至使用FORCE INDEX,我尝试用 LIKE 代替 equal (=) 但另一篇文章说 =更快,如果通配符仅在末尾,则可以使用它),在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

ci.id 上有一个PRIMARY,在ci.city_real 上有一个INDEX。任何想法为什么 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    

【问题讨论】:

    标签: mysql sql indexing innodb


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-12-07
        • 2016-03-02
        • 2022-08-12
        • 1970-01-01
        • 1970-01-01
        • 2019-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多