0

我有以下mysql查询

select points_for_user from items where user_id = '38415';

解释查询返回这个

id  select_type table   type    possible_keys   key                     key_len ref     rows    Extra
1   SIMPLE      items   index   NULL            points_for_user_index   2       NULL    1000511 Using index

问题是,由于索引,行数不应该远小于表中的行数吗?

user_id 是主索引,所以我尝试在 points_for_user 上创建一个索引,并且仍然查看每一行。user_id AND points_for_user 上的索引仍然搜索每一行。

我错过了什么?

谢谢!

CREATE TABLE IF NOT EXISTS `items` (
  `capture_id` int(11) NOT NULL AUTO_INCREMENT,
  `id` int(11) NOT NULL,
  `creator_user_id` bigint(20) NOT NULL DEFAULT '0',
  `user_id` int(11) NOT NULL,
  `accuracy` int(11) NOT NULL,
  `captured_at` timestamp NOT NULL DEFAULT '2011-01-01 06:00:00',
  `ip` varchar(30) NOT NULL,
  `capture_type_id` smallint(6) NOT NULL DEFAULT '0',
  `points` smallint(6) NOT NULL DEFAULT '5',
  `points_for_user` smallint(6) NOT NULL DEFAULT '3',
  PRIMARY KEY (`capture_id`),
  KEY `capture_user` (`capture_id`,`id`,`user_id`),
  KEY `user_id` (`user_id`,`id`),
  KEY `id` (`id`),
  KEY `capture_creator_index` (`capture_id`,`creator_user_id`),
  KEY `points_capture_index` (`points_for_user`,`creator_user_id`),
  KEY `points_for_user_index` (`points_for_user`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1008992 ;

select count(*) from items where user_id = '38415'

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  captures    ref user_munzee_id  user_munzee_id  4   const   81  Using index
4

1 回答 1

0

mysql 优化器在查询期间尝试使用最佳索引。

在您的第一个查询中,优化器正在考虑 points_for_user_index 的最佳选择,实际上 Extra 列显示“使用索引”状态,这意味着“覆盖索引”。

当查询所需的所有字段(在您的情况下 select points_for_user from ... )都包含在索引中时,会发生“覆盖索引”,这避免了访问完整的 mysql 数据(.MYD),有利于直接索引访问(。我的我)

首先你可以尝试重建索引树分析表

分析表项;

非常大的表的注意事项

ANALYZE TABLE 分析并存储表的键分布。在分析过程中,表被 InnoDB 和 MyISAM 的读锁锁定。此语句适用于 InnoDB、NDB 和 MyISAM 表。对于 MyISAM 表,此语句等效于使用 myisamchk --analyze。

如果“问题”仍然存在并且您想绕过优化器选择,您可以显式尝试强制使用索引

EXPLAIN SELECT points_for_user FROM items USE INDEX ( user_id ) WHERE user_id = '38415'

更多细节:http ://dev.mysql.com/doc/refman/5.5/en/index-hints.html

克里斯蒂安

于 2012-08-27T06:28:19.533 回答