mysql的索引类型

  • 索引是在引擎层实现,因此有各种各样的索引

B树索引

  • 大多数mysql引擎都支持B树索引,某一些不支持,如Archive
  • InnoDB使用B+树,而NDB集群引擎使用T树
  • myISAM使用前缀压缩技术,因此索引更小
  • B树的结构更适合查找范围数据,例如按字母顺序查找名字
  • 索引对多个值的排序的依据是根据定义索引时的顺序来进行的,例如创建了一个表
    CREATE TABLE XXX(
    	A VARCHAR(10) NOT NULL,
    	B VARCHAR(20) NOT NULL,
    	C VARCHAR(20) NOT NULL,
    	KEY(A,B,C))
    
    那么就会将A作为索引比较值顺序,如果A相同再比较B
  • 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支持空间索引,可以用来储存地理数据

全文索引

  • 全文索引类似于搜索引擎的事情,它寻找的是关键值
posted @ 2021-12-04 21:34  NoBugNoError  阅读(122)  评论(0)    收藏  举报