MySQL索引学习笔记(摘抄自开课吧MySQL集训营)

文章目录

  • 索引介绍
    • 索引作用
    • 索引的优劣
      • 优势
      • 劣势
    • 索引的分类
      • 单列索引
      • 组合索引
      • 全文索引
      • 空间索引
    • 索引原理分析
      • 索引的存储结构
      • 索引的存储类别
        • 非聚集索引(MyISAM)
        • 聚集索引(InnoDB)
    • 索引使用
      • SQL
        • 创建索引
        • 删除索引
        • 查看索引
      • 场景

索引介绍

官方介绍索引是帮助MySQL高效获取数据的数据结构。更通俗的说,数据库索引好比是⼀一本书前 面的目录,能加快数据库的查询速度。

索引作用

  • ⽅便查找—检索
  • 索引查询内容—覆盖索引
  • 排序

索引的优劣

优势

  1. 检索:可以提⾼高数据检索的效率,降低数据库的IO成本,类似于书的⽬目录。

  2. 排序:通过索引列列对数据进⾏行行排序,降低数据排序的成本,降低了CPU的消耗

  • 被索引的列列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。
  • 如果按照索引列列的顺序进⾏排序,对应order by语句句来说,效率就会提高很多。
  1. where 索引列在存储引擎层处理(索引下推)。
  2. 覆盖索引,不需要回表查询。

劣势

  1. 索引会占据磁盘空间
  2. 索引虽然会提⾼高查询效率,但是会降低更更新表的效率。

比如每次对表进行增删改操作,MySQL不 仅要保存数据,还有保存或者更更新对应的索引⽂文件。

索引的分类

单列索引

  • 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值, 纯粹为了查询数据更快⼀点。 add index
  • 唯⼀索引:索引列中的值必须是唯⼀的,但是允许为空值. add unique index
  • 主键索引:是⼀种特殊的唯⼀一索引,不允许有空值。

组合索引

  • 在表中的多个字段组合上创建的索引 add index(col1,col2..)
  • 组合索引的使⽤用,需要遵循左前缀原则(左匹配原则,后⾯面高级篇讲解)。
  • ⼀般情况下,建议使用组合索引代替单列索引。

组合索引比多个单列索引节约空间,更容易覆盖索引,避免回表查询。

全文索引

  • 只有在MyISAM引擎、InnoDB(5.6以后)上才能使用,而且只能在CHAR,VARCHAR,TEXT类型字段上 使⽤用全⽂文索引。
  • 优先级⾼ 先执⾏ 不会执行其他索引
  • 存储引擎决定执行一个索引

空间索引

不做介绍,一般使用不到

索引原理分析

索引的存储结构

  • 索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引
  • MyISAM和InnoDB存储引擎:只支持B+ TREE索引, 也就是说默认使用B+TREE,不能够更换
  • MEMORY/HEAP存储引擎:支持HASH和BTREE索引

索引的存储类别

非聚集索引(MyISAM)

  • B+树叶⼦子节点只会存储数据⾏行行(数据⽂文件)的指针,简单来说数据和索引不不在⼀一起,就是⾮非聚集 索引。
  • ⾮聚集索引包含主键索引和辅助索引都会存储指针的值
  • 例子:
    1. 主键索引
      MySQL索引学习笔记(摘抄自开课吧MySQL集训营)_第1张图片
    2. 辅助索引(次要索引)

在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯⼀的,而辅助索引的 key 可以重复。

聚集索引(InnoDB)

  • 主键索引(聚集索引)的叶⼦子节点会存储数据行,也就是说数据和索引是在⼀起,这就是聚集索引。
  • 辅助索引只会存储主键值
  • 如果没有主键,则使用唯⼀索引建立聚集索引;如果没有唯⼀索引,MySQL会按照⼀定规则 创建聚集索引。
  • 例子
    1. 主键索引
      MySQL索引学习笔记(摘抄自开课吧MySQL集训营)_第2张图片
    2. 辅助索引(次要索引)
      MySQL索引学习笔记(摘抄自开课吧MySQL集训营)_第3张图片

select * from user where name=‘Alice’ 回表查询
检索两次 非主键索引 – pk—索引—>数据
select id,name from user where name=‘Alice’
不需要回表 在辅助索引树上就可以查询到了 -->覆盖索引 (多用组合索引)

不建议用过长的字段作为主键,因为所有的辅助索引都需要存储主键

索引使用

SQL

创建索引

  • 普通索引
    CREATE INDEX index_name ON table(column(length)) ; ALTER TABLE table_name ADD INDEX index_name (column(length))
  • 唯一索引
    CREATE UNIQUE INDEX index_name ON table(column(length)) ; alter table table_name add unique index index_name(column);
  • 组合索引
    ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10)) ;
  • 全文索引
    CREATE FULLTEXT INDEX index_name ON table(column(length)) ; alter table table_name add fulltext index_name(column);

删除索引

DROP INDEX index_name ON table

查看索引

SHOW INDEX FROM table_name \G

场景

  • 需要创建索引
  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 多表关联查询中,关联字段应该创建索引 ,on两边都要创建索引
  4. 查询中排序的字段,应该创建索引
  5. 频繁查找字段 覆盖索引
  6. 查询中统计或者分组字段,应该创建索引 group by
  • 不需要创建索引
  1. 表记录太少
  2. 经常进行增删改操作的表
  3. 频繁更新的字段
  4. where条件里使用频率不高的字段

你可能感兴趣的:(数据库,#,MySQL)