美文网首页
MySql 索引

MySql 索引

作者: szn好色仙人 | 来源:发表于2018-09-17 21:33 被阅读0次

B-Tree

  • B-Tree通常意味着所有值都是按顺序存储的,每个叶到根的距离相同
  • B-Tree索引能够加快访问数据的速度,因为存储引擎不需要进行全表扫描来获取需要的数据
  • B-Tree对索引列是顺序组织的,所以很适合查找范围数据,也支持order by
  • B-Tree适用于全键值、键值范围或键前缀查找(键前缀查找只适用于根据最左前缀查找)

B-Tree的限制

  • 如果不是按照索引最左列开始查找,则无法使用索引
  • 不能跳过索引的列
  • 如果查询中有某个列的范围查询,则其右边的列无法使用索引优化查询
  • 例子
create table if not exists Test 
(
    id int not null auto_increment, 
    name varchar(260), 
    age tinyint,
    sex tinyint, 
    primary key(id)
);
show index from test;
create table if not exists Test3
(
    id int, 
    age tinyint,
    sex tinyint, 
    key(id, age, sex),
    key(age, sex)
);
show index from test3;


哈希索引

  • 哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效
  • MySql中只有MEMORY引擎显示支持哈希索引,这也是MEMORY引擎的默认索引类型,此引擎也支持B-Tree索引。并且,此引擎支持非唯一哈希索引(其解决哈希冲突的方法是链表法)
  • 哈希索引自身只存储对应的哈希值,所以索引结构十分紧凑,这也让哈希查找的速度非常快

哈希索引限制

  • 哈希索引只包含哈希值和行指针,并不存储字段,所以不能使用索引中的值,来避免读取行。不过访问内存中的行的速度很快,所以这一条规则对性能影响不大
  • 哈希索引数据不是按照索引值顺序存储的,所以无法用于排序
  • 哈希索引不支持部分索引列匹配查找,因为哈希索引始终是索引列的全部内容来计算哈希值的
  • 哈希索引只支持等值比较查询(=、 in()),不支持任何范围查询
  • 例子
create table if not exists Test4
(
    id int, 
    age tinyint,
    sex tinyint, 
    key using hash(id, age)
) ENGINE = memory;
show index from test4;


高性能的索引策略

  • 使用独立的列,索引列不能是表达式的一部分也不能是函数的参数
    select id from T where id + 1 = 5此Sql语句就无法使用id列的索引

  • 前缀索引
    有时候需要索引很长的字符列,这会让索引变得大且慢,一个策略是模拟哈希索引,或者是索引开始的部分字符。Mysql的前缀索引无法进行order bygroup by

create table if not exists Test6
(   
    id int not null auto_increment, 
    name varchar(260), 
    primary key(id), 
    key(name(5))
)


聚簇索引

  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行(数据行存放在索引的叶子叶中)。因为无法把数据行放在两个不同的地方,所以一个表只能由一个聚簇索引
  • InnoDB通过主键聚集数据,如果没有定义主键,InnoDb会选择一个唯一的非空索引代替,如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引

聚簇索引的优点

  • 可以把相关数据保存在一起以减少从磁盘读取的次数
  • 访问速度更快,因为聚簇索引将索引与数据保存在同一个B-Tree中
  • 使用聚簇索引扫描的查询可以直接使用叶节点的主键值

聚簇索引的缺点

  • 聚簇数据提高了I/O密集型应用的性能,但是如果数据全部存储在内存中,则访问的顺序就没什么重要的了,则聚簇索引也没什么优势了
  • 插入速度严重依赖于插入顺序,按照主键顺序插入时加载数据到InnoDB表中速度最快
  • 更新聚簇索引的代价很高,因为会强制InnoDB将每个更新行移动到新的位置
  • 基于聚簇索引的表在插入新行或者主键被更新导致需要移动行
  • 二级索引(非聚簇索引)的叶子节点包含了引用行的主键值而非行指针,所以需要两次索引查找
  • 如果正在使用的InnoDB表没有什么数据需要聚集,那么可以定义一个代理键作为主键,这种键的数据应该与应用无关,最简单的方法是使用AUTO_INCREMENT自增列,这样可以保证数据行是按照顺序写入的。
  • 需要避免使用随机且分布范围很大的聚簇索引。InnoDB应该尽可能按照主键顺序插入数据,并尽可能使用单调增加的聚簇键来插入新行

相关文章

  • MySQL索引及查询优化书目录

    MySQL索引的原理之索引目的 MySQL索引的原理之索引原理 MySQL索引的原理之索引的类型 MySQL索引的...

  • 高性能的索引策略

    MySQL查询基础-查询执行过程 MySQL聚簇索引 MySQL覆盖索引 MySQL索引扫描排序 MySQL冗余和...

  • MySQL索引的使用

    MySQL索引 MySQL索引可以快速提高MySQL的检索速度。索引分单列索引和组合索引单列索引:即一个索引只包含...

  • Mysql索引与锁

    本文以Mysql5.7为例测试。 1:mysql索引方法 Mysql的索引方法分为btree索引和hash索引。 ...

  • 索引(二)

    mysql索引的新手入门详解mysql索引之三:索引使用注意规则 索引(Index)是帮助 MySQL 高效获取数...

  • MySQL 索引分类

    MySQL索引的分类(根据数据结构) 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL...

  • MySQL--索引

    MySQL索引 查看索引 创建索引 创建唯一索引 创建主键索引 删除索引 删除主键 MySQL视图 创建视图 删除...

  • mysql索引

    索引 mysql索引的建立对于mysql的高效运行是很重要的,索引可以大大提高mysql的检索速度。索引分单列索引...

  • 5.2MySQL创建高性能索引考察点

    MySQL索引的基础和类型延伸:MySQL索引的创建原则延伸:MySQL索引的注意事项 索引的基础索引类似于书籍的...

  • MySql 数据查询优化

    1. MySQL索引类型: mysql的索引有5种:主键索引、普通索引、唯一索引、全文索引、聚合索引(多列索引)。...

网友评论

      本文标题:MySql 索引

      本文链接:https://www.haomeiwen.com/subject/nondnftx.html