【问题标题】:MySQL won't use index for query?MySQL不会使用索引进行查询?
【发布时间】:2010-04-03 15:07:10
【问题描述】:

我有这张桌子:

CREATE TABLE `point` (                                                                                 
          `id` INT(11) NOT NULL AUTO_INCREMENT,                                                                
          `siteid` INT(11) NOT NULL,                                                                           
          `lft` INT(11) DEFAULT NULL,                                                                          
          `rgt` INT(11) DEFAULT NULL,                                                                          
          `level` SMALLINT(6) DEFAULT NULL,                                                                    
          PRIMARY KEY  (`id`),                                                                                 
          KEY `point_siteid_site_id` (`siteid`),                                                               
          CONSTRAINT `point_siteid_site_id` FOREIGN KEY (`siteid`) REFERENCES `site` (`id`) ON DELETE CASCADE  
        ) ENGINE=INNODB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci        

这个查询:

SELECT * FROM `point` WHERE siteid = 1;

这会导致此 EXPLAIN 信息:

+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys        | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | point | ALL  | point_siteid_site_id | NULL | NULL    | NULL |    6 | Using where |
+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+

问题是,为什么不使用 point_siteid_site_id 索引进行查询?

【问题讨论】:

  • 我重新创建了您的表,它显然使用了预期的索引。
  • 当然不适合我,这是我收到的那个查询的确切 EXPLIAN 输出。

标签: mysql optimization indexing key


【解决方案1】:

我用的MySQL不多,但是在PostgreSQL中,如果表中的记录数很少,可以决定不使用索引。这不是问题,因为它会根据情况选择最佳查询计划。当记录数较大时,它将使用索引。也许这与 MySQL 的情况相同。

编辑:你确定外键被索引了吗?

【讨论】:

  • 最近的 Mysql 版本会在定义为外键的任何字段上自动创建键,而不是让你单独创建它。
【解决方案2】:

这可能是因为您没有足够的样本数据,或者 siteid 值的基数(多样性)不是很大。这些是优化器发现读取所有值更快的最常见原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 2016-01-23
    • 2014-01-12
    • 2013-10-26
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    相关资源
    最近更新 更多