MySQL索引无效。

3
我遇到了一个MySQL索引的奇怪问题。我有一个名为views_video的表:
CREATE TABLE `views_video` (
  `video_id` smallint(5) unsigned NOT NULL,
  `record_date` date NOT NULL,
  `region` char(2) NOT NULL DEFAULT '',
  `views` mediumint(8) unsigned NOT NULL
  PRIMARY KEY (`video_id`,`record_date`,`region`),
  KEY `video_id` (`video_id`)
)
这个表包含340万条记录。

我在这个查询上运行了EXPLAIN

SELECT video_id, views FROM views_video where video_id <= 156

I got:

+----+-------------+-------------+-------+------------------+----------+---------+------+--------+-------------+
| id | select_type | table       | type  | possible_keys    | key      | key_len | ref  | rows   | Extra       |
+----+-------------+-------------+-------+------------------+----------+---------+------+--------+-------------+
|  1 | SIMPLE      | views_video | range | PRIMARY,video_id | video_id | 2       | NULL | 587984 | Using where |
+----+-------------+-------------+-------+------------------+----------+---------+------+--------+-------------+

但是当我在这个查询上运行EXPLAIN命令时:
SELECT video_id, views FROM views_video where video_id <= 157

I got:

+----+-------------+-------------+------+------------------+------+---------+------+---------+-------------+
| id | select_type | table       | type | possible_keys    | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------------+------+------------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | views_video | ALL  | PRIMARY,video_id | NULL | NULL    | NULL | 3412892 | Using where |
+----+-------------+-------------+------+------------------+------+---------+------+---------+-------------+
video_id是从1到1034的数字。在156和157之间没有什么特别之处。
这里发生了什么?
*更新*
我已经向数据库中添加了更多数据。现在video_id从1到1064。表格现在有380万条记录。差异变成了114和115。

有多少条记录的id是158+和157? - SergeS
好的,那么这两个查询之间有显著的速度差异吗?如果没有,那么原因可能是在更低的层面上,不要费心。 - SergeS
@SergeS 没有太大的区别,但为什么? - DrXCheng
114有多少行,115有多少行? - Sebas
3个回答

2
如果在创建表后添加/删除了大量数据,则值得尝试对其执行ANALYZE TABLE。它经常解决许多幻像索引问题,并且即使在大型表上也非常快速。
更新:此外,唯一索引值与表中行数相比非常低。当单个索引值指向太多行时,MySQL不会使用索引。尝试使用另一个列进一步限制查询,该列是主键的一部分。

2
我猜测,您有340万条记录,但仅有1064个可能的键入项,导致选择性非常低。(换句话说,存在许多重复项,这使其作为关键词变得不太有用。)如果使用关键词更有效,优化器将尽最大努力去使用它;否则就不使用。您已经找到了该决策的阈值。

2

可能是关键人口

运行这些命令

SELECT (COUNT(1)/20) INTO @FivePctOfData FROM views_video;
SELECT COUNT(1) videpidcount,video_id FROM FROM views_video
WHERE id <= 157 GROUP BY video_id;

当其中一个关键字达到5%阈值时,查询优化器可能会休息。

您说有340万行数据。5%将是170,000。也许在查询优化器的生命周期中某个时刻,这个数字已经超过了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接