MySQL面试题大全1

1.mysql的索引机制,什么是索引

索引的概念:

索引是对数据库表中一列或者多列的值进行排序的一种结构。

MYSQL索引存在的意义就是提高检索速度。

索引的优点:

  • 大大的减少服务器扫描的数据量,加快检索速度。
  • 避免排序和创建临时表
  • 将随机IO变成顺序IO
  • 索引对支持行级锁的InnoDB非常重要,查询锁更少元组,提高了并发性
  • InnoDB在二级索引使用共享锁(读锁),但是访问主键索引需要排他锁(写锁)
  • 通过创建唯一性索引,可以保证数据库表每一行数据唯一
  • 可以加速表与表的连接
  • 使用分组和排序子句进行检索时,可以减少查询中分组和排序的时间。
  • 使用索引进而使用优化隐藏器,提高系统性能。

索引的缺点:

  • 创建索引和维护索引需要耗费时间,随着数据量的增加而增加
  • 需要占物理空间。如果建立聚簇索引,那么需要占用的空间会更大
  • 对表数据进行增删改的时候也需要维护索引
  • 包含太多重复数据的时候就失去了实际效果

何时创建索引?

  • 经常搜索,作为主键,作为外键 范围搜索 排序 where

不该创建索引的情况

查询中很少使用的、修改多的、大量重复的

索引结构

B-Tree 树高一层就说明要多做一次IO操作

B树的特点:
  • 关键字集合分布在整棵树中。
  • 任何一个关键字只出现在一个节点中
  • 搜索有可能在非叶子节点结束
  • 关键字全集做一个二分查找
  • 自动层次控制
B+Tree 的特点
  • 所有关键字都出现在叶子结点的链表中(稠密索引),且恰好都是有序的
  • 不可能在非叶子结点命中
  • 非叶子结点相当于叶子结点索引(稀疏索引),叶子结点相当于存储关键字数据的数据层
  • 每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历。
  • 更适合文件索引系统。
Hash : 不支持范围查询

哈希索引就是一种哈希算法。把键值对换成新的哈希值。不需要像B+树那样子从根节点逐级查找。只需要一次哈希就可以找到位置,速度非常快。
在这里插入图片描述

补充:索引存储在文件系统中

索引是占用物理空间,在不同的存储引擎,索引存在的文件也不同。存储引擎是基于表的,以下分别是基于MyISAM和InnoDB存储引擎建立的两张表。
在这里插入图片描述

存储引擎为MyISAM:
  • .frm:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等
  • .MYD:MyISAM DATA,用于存储MyISAM表的数据
  • .MYI:MyISAM INDEX,用于存储MyISAM表的索引相关信息
存储引擎InnoDB
  • .frm存储表相关的元数据信息都存放在frm中 。包括表的结构和定义信息等
  • .ibd InnoDB的表数据和索引都保存在这里面

索引分类

逻辑分类:

按照功能划分:
  • 主键索引:一张表只能有一个主键索引,不允许重复,不允许为NULL
  • ALTER TABLE TableName ADD PRIMARY KEY(column_list)
  • 唯一索引: 数据列不允许重复,允许为NULL值,一张表可以有多个唯一索引,索引列必须唯一,但允许有空值。如果是组合索引,列值组合必须唯一。
  • CREATE UNIQUE INDEX indexName ON ‘TableName’(‘字段名’(length)); 或者
  • ALTER TABLE TableName ADD UNIQUE (column_list)
  • 普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许NULL插入
  • CREATE INDEX IndexName ON ‘TabelName’(‘字段名’(length)) 或者
  • ALTER TABLE TableName ADD INDEX IndexName(‘字段名’(length));
  • 全文索引 : 它查找的文本中的关键词,主要用于全文检索。
按列数划分
  • 单例索引: 一个索引只包含一个列,一个表可以有多个单例索引
  • 组合索引:一个索引包含两个或者两个以上的列。查询的时候遵循mysql组合索引的“最左前缀”原则,即使用where时条件要按照建立索引的时候字段的排列方式放置索引才会生效。
物理分类

分为聚簇索引和非聚簇索引(有时也称为辅助索引或者二级索引)

聚簇索引和非聚簇索引

聚簇是为了提高某个属性(或者属性组)的查询速度,把这个活儿这些属性(称为聚簇码)上具有相同值得元组集中存放在连续的物理块中。

聚簇索引(cluster index)不是单独的索引类型,而是一种数据存储方式。这种存储方式是依靠B+树来实现的,根据表的主键构造一颗B+树且B+树叶子节点存放的都是表的行记录数据时,方可称该主键索引为聚簇索引。聚簇索引也可理解为将数据存储和索引放到了一块,找到了索引也就找到了数据

非聚簇索引:数据和索引是分开的,B+树的叶子节点不是数据表行记录

虽然InnoDB和MyISAM存储引擎都是默认使用B+树结构存储索引,但是只有InnoDB的主键才是聚簇索引,InnoDB中的辅助索引以及MyISAM使用的都是非聚簇索引。每张表最多只能拥有一个聚簇索引。

聚簇索引优缺点:
优点:

  • 数据访问更快,因为聚簇索引将索引和数据存储在一个B+树中,因此从聚簇索引中获取数据更快。
  • 对于主键的排序查找和范围查找速度非常快

缺点:

  • 依赖插入顺序。按照主键的顺序插入式最快的方式。
  • 更新主键的代价很高。
  • 二级索引访问需要两次索引查找。第一次找到主键,第二次找得到行数据。

InnoDB和MyISAM索引

InnoDB索引实现
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值