为了选择 索 引类型,需要考虑在索引数据列上将执行的比较操作类型: · 对于散列(hash)索引,会在每个数据列值上应用散列函数。生成的结 果散列值存储在索引中,并用于执行查询。散列函数实现的算法类似于为不同的 输入值生 成不同的散列值。使用散列值的好处是散列值比原始值的比较效率更 高。 散列索引用于执行=或<=>操作等精确匹配的时候速度非常快。 但是对于查 询 一个值的范围效果就非常差了: id < 30 weight BETWEEN 100 AND 150 · B 树索引可以用于高效率地执行精确的或者基于范围(使用操作<、<=、 =、>=、>、<>、!=和 BETWEEN)的比较。B 树索引也可以用于 LIKE 模式匹配,前 提是该模式以文字串而不是通配符开头。 如果你使用的 MEMORY 数据表只进行精确值查询,散列索引是很好的选择。 这是 MEMORY 表使用的默认的索引类型,因此你不需要特意指定。如果你希望 在 MEMORY 表上执行基于范围的比较,应该使用 B 树索引。为了指定这种索引类型, 需要给索引定义添加 USING BTREE。例如: CREATE TABLE lookup ( id INT NOT NULL, name CHAR(20), PRIMARY KEY USING BTREE (id) ) ENGINE = MEMORY; 如果你希望执行的语句的类型允许,单个 MEMORY 表可以同时拥有散列索引 和 B 树索引,即使在同一个数据列上。 有些类型的比较不能使用索引。如果你只是通过把值传递到函数(例如 STRCMP())中来执行比较操作,那么对它进行索引就没有价值。