Ben Giles Asked: 2016-06-04 10:48:31 +0800 CST2016-06-04 10:48:31 +0800 CST 2016-06-04 10:48:31 +0800 CST Mysql只读引擎类型和索引 772 我有一个 mysql 表。该表只有三列。两个是varchar(5),一个是varchar(32)。只会对表运行一个查询。 从 mytable 选择(第 1 列),(第 2 列),其中第 3 列 = xxxxx 表将每月删除一次并使用新数据重新创建。除此之外,该表将是只读的,并且只能使用上述查询进行查询。 查询中使用的列不唯一或为空。我假设我会向该列添加一个常规索引。将索引添加到其他 2 列会有什么好处吗? 最大行数约为 5,000 另外,哪个表引擎最好? mysql index 1 个回答 Voted Best Answer jkavalik 2016-06-04T11:09:55+08:002016-06-04T11:09:55+08:00 如果您通过添加二级索引来解决它,那么恕我直言,MyISAM 或 InnoDB 将无关紧要,因为它们都使用 B-Tree 索引。 将两个附加列附加到索引:(col3, col1, col2)或者(col3, col2, col1)对于您的查询应该表现相同。 添加所有列的原因是这样的索引涵盖了您的查询——解析查询所需的所有数据都包含在索引中,因此不需要从表中读取实际行。这意味着您要获取的数据在磁盘上分组在一起(索引按排序/聚类col3)并且不需要随机读取“主”表。 如果你只有索引,(col3)那么每一行可能存储在表的不同部分(取决于你的主键或插入顺序)并且它会随机跳到所有地方,导致 IO 损失。 如果您没有主键,那么 MyISAM 可能会更好,因为 InnoDB 会创建内部主键并且表会占用比需要更多的空间。 但是有可能在不使用任何辅助密钥的情况下解决它。像这样使用 InnoDB 表 create table t ( col1 varchar(5), col2 varchar(5), col3 varchar(32) not null, col4 smallint unsigned not null auto_increment, primary key(col3, col4), key(col4) ) engine = innodb; 这样,该表将使用 InnoDB 按主键进行集群的功能 - 有效地强制执行前面描述的最佳顺序和行分组。并且它只需要多一点空间用于附加列(仅 2 个字节,如果你确定行数总是少于 60k)和更小的辅助键来适应auto_increment行为而不是有效地拥有 2 个表副本与其他版本一样。 示例:http ://sqlfiddle.com/#!9/c36cfc/2
如果您通过添加二级索引来解决它,那么恕我直言,MyISAM 或 InnoDB 将无关紧要,因为它们都使用 B-Tree 索引。
将两个附加列附加到索引:
(col3, col1, col2)
或者(col3, col2, col1)
对于您的查询应该表现相同。添加所有列的原因是这样的索引涵盖了您的查询——解析查询所需的所有数据都包含在索引中,因此不需要从表中读取实际行。这意味着您要获取的数据在磁盘上分组在一起(索引按排序/聚类
col3
)并且不需要随机读取“主”表。如果你只有索引,
(col3)
那么每一行可能存储在表的不同部分(取决于你的主键或插入顺序)并且它会随机跳到所有地方,导致 IO 损失。如果您没有主键,那么 MyISAM 可能会更好,因为 InnoDB 会创建内部主键并且表会占用比需要更多的空间。
但是有可能在不使用任何辅助密钥的情况下解决它。像这样使用 InnoDB 表
这样,该表将使用 InnoDB 按主键进行集群的功能 - 有效地强制执行前面描述的最佳顺序和行分组。并且它只需要多一点空间用于附加列(仅 2 个字节,如果你确定行数总是少于 60k)和更小的辅助键来适应
auto_increment
行为而不是有效地拥有 2 个表副本与其他版本一样。示例:http ://sqlfiddle.com/#!9/c36cfc/2