MySQL-同一列的BTree和Hash索引

MySQL-同一列的BTree和Hash索引,mysql,sql,indexing,b-tree-index,Mysql,Sql,Indexing,B Tree Index,我试图找到类似的问题,但除了关于同一列的两个索引的问题(一般而言),没有找到任何问题 假设我们有一个表,其中有一列COL。该表(以及整个数据库)对于客户端是只读的(假设它每隔很长一段时间更新一次/一次,并且仅由后端服务更新)。因此,插入/更新时间无关紧要 对于该列,有一些高度使用的查询,用于搜索COL值在某个范围内的行,还有一些更高度使用的查询,用于搜索COL与值直接比较的行(相等检查) 鉴于上述情况,在COL上同时保存BTREE和HASH索引是否有益?优化器是否将BTREE索引用于范围查询,将

我试图找到类似的问题,但除了关于同一列的两个索引的问题(一般而言),没有找到任何问题

假设我们有一个表,其中有一列
COL
。该表(以及整个数据库)对于客户端是只读的(假设它每隔很长一段时间更新一次/一次,并且仅由后端服务更新)。因此,插入/更新时间无关紧要

对于该列,有一些高度使用的查询,用于搜索
COL
值在某个范围内的行,还有一些更高度使用的查询,用于搜索
COL
与值直接比较的行(相等检查)

鉴于上述情况,在
COL
上同时保存
BTREE
HASH
索引是否有益?优化器是否将
BTREE
索引用于范围查询,将
HASH
索引用于直接比较查询? 如果
COL
类型为
varchar(256)
,答案会改变吗


谢谢

我会坚持使用B-Tree索引,因为您无论如何都需要它。使用散列索引也可能会带来一些小的性能提升,但您也将占用更多内存


更重要的是,哈希索引不适用于最常见的存储引擎(InnoDB和MyISAM)--中的表13.1。

我们如何最好地评估性能增益(使用哈希索引)与索引将占用的额外内存?为了提高性能,我们什么时候会选择添加索引?@Mickey。您可以在使用索引的查询上使用每个索引运行计时。这会让你了解它们的益处。但是,哈希索引在最常见的存储引擎上不可用这一事实似乎是一个相当严肃的考虑因素。例如,如果在事务中使用在内存中执行相等操作(=或)的表,则哈希索引非常有用。(例如,其中inMemoryTable.hashIndexedColumnFOO='BAR')