mysql的索引类型
- 索引是在引擎层实现,因此有各种各样的索引
B树索引
- 大多数mysql引擎都支持B树索引,某一些不支持,如Archive
- InnoDB使用B+树,而NDB集群引擎使用T树
- myISAM使用前缀压缩技术,因此索引更小
- B树的结构更适合查找范围数据,例如按字母顺序查找名字
- 索引对多个值的排序的依据是根据定义索引时的顺序来进行的,例如创建了一个表
那么就会将A作为索引比较值顺序,如果A相同再比较BCREATE TABLE XXX( A VARCHAR(10) NOT NULL, B VARCHAR(20) NOT NULL, C VARCHAR(20) NOT NULL, KEY(A,B,C)) - B树索引适合以下的查找方式
- 全值匹配查找:例如找到某个姓名为张三的人
- 匹配最左前缀:例如找到姓王的人
- 匹配列前缀:例如找到拼音为W开头的人
- 匹配范围值:例如查找姓在a和b之间的人
- 多列索引可以匹配一列并匹配其他的列
- 只访问索引的查询:只需要查询索引,而不需要访问数据行
- B树索引的限制
- 不能跳过索引中的列:例如在列A,B上创建索引,只使用A查找,那么Mysql只能使用第一列,不能使用第二列
- 对于范围查询,例如查找A='aaa' AND B='b%' AND C='ccc'时,只能使用A和B列进行索引,在范围查询的右边不能使用使用索引优化查找
哈希索引
- hash索引只有Memory引擎显式支持,Memory支持非唯一hash索引,即如果有多个索引值,那么就以链表形式存储
- 缺点:
- 哈希索引只包含哈希值和行,因此不能直接使用索引的值而避免读取行
- 哈希索引的值并不是按顺序存储,所以无法用于排序
- 如果在多个列上建立哈希索引,那么无法使用单个列进行查找
- 只能使用等值方式查找,不能进行范围查找
- InnoDB使用一种自适应哈希索引方法,当B树的索引被多次使用时,就会在索引之上创建一个哈希索引,这是一种自动行为
- 如果不支持哈希索引,可以用一种思路,自己定义一个哈希函数,然后将索引值进行哈希映射到某个整数值,这一个过程可以通过创建一个触发器来实现。例如在对字符串进行哈希映射,然后再对映射值建立索引,就比在字符串上直接创建索引要高效的多。当然,对于这种hash冲突来讲,我们可以在条件中添加等值条件来避免冲突
空间数据索引
- MyISAM支持空间索引,可以用来储存地理数据
全文索引
- 全文索引类似于搜索引擎的事情,它寻找的是关键值
浙公网安备 33010602011771号