MySQL 索引 VarChar

12 mysql varchar

我正在尝试索引我的blogentries数据库以获得更好的性能,但发现了一个问题。

这是结构:

CREATE TABLE IF NOT EXISTS `blogentries` (
  `id_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `title_id` varchar(100) COLLATE latin1_german2_ci NOT NULL,
  `entry_id` varchar(5000) COLLATE latin1_german2_ci NOT NULL,
  `date_id` int(11) NOT NULL,
  PRIMARY KEY (`id_id`)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1
COLLATE=latin1_german2_ci
AUTO_INCREMENT=271;
Run Code Online (Sandbox Code Playgroud)

像下面这样的查询正确使用索引:

EXPLAIN SELECT id_id,title_id FROM blogentries ORDER by id_id DESC
Run Code Online (Sandbox Code Playgroud)
+----+-------------+------------+---------+-------- -------+---------+---------+------+------+-------- -----+
| 身份证 | 选择类型 | 表| 类型 | 可能的密钥| 关键| 密钥长度 | 参考 | 行 | 额外 |
+----+-------------+------------+---------+-------- -------+---------+---------+------+------+-------- -----+
| 1 | 简单 | 博客| 索引 | 空 | 主要 | 114 | 空 | 126 | 使用索引 |
+----+-------------+------------+---------+-------- -------+---------+---------+------+------+-------- -----+

但是,当我将它添加entry_idSELECT查询中时,它使用文件排序

EXPLAIN SELECT id_id,title_id,entry_id FROM blogentries ORDER by id_id DESC
Run Code Online (Sandbox Code Playgroud)
+----+-------------+------------+-------+--------- ------+------+---------+------+------+------- ----+
| 身份证 | 选择类型 | 表| 类型 | 可能的密钥| 关键| 密钥长度 | 参考 | 行 | 额外 |
+----+-------------+------------+-------+--------- ------+------+---------+------+------+------- ----+
| 1 | 简单 | 博客| 所有 | 空 | 空 | 空 | 空 | 126 | 使用文件排序 |
+----+-------------+------------+-------+--------- ------+------+---------+------+------+------- ----+

我想知道为什么会发生这种情况以及如何避免它?是因为VarChar, 应该改成别的东西吗?

我试图让我的所有查询都使用索引,因为我遇到了高值Handler_read_rndHandler_read_rnd_next值。

如果您需要任何其他信息,我也可以发布。

小智 7

由于您WHERE在任一查询中都没有子句,因此您在两种情况下都返回所有行,因此我认为在这些示例中使用或不使用索引对性能的影响很小。