MySql基础与索引的理解

1、关于数据库引擎

常用的有两种:MyISAM和InnoDB
区别

  1. MyISAM是MySql 5.0以前默认的数据库引擎,拥有很高的插入和查询速度,但是不支持事务,不支持外键,主要用于“”多的场合;
  2. InnoDB是事务型数据库首选的数据库引擎,支持ACID事务,支持外键,是MySql 5.5以后默认的数据库引擎。

2、常用Sql语句

增加数据

  1. insert into 表名 values(列值,与表中列名一一对应);
  2. insert into 表名(列名1,列名2,……) values(列值1,列值2,……);

删除数据

  1. 删除表中全部数据:delete from 表名;
  2. 按条件删除:delete from 表名 where 条件;

更新数据

  1. update 表名 set 列名 = 新值 where 条件;

查询数据
这是Sql里语法最多,也是最难的一个部分

在这里插入图片描述
基本语法是:select 列名 from 表名 where 条件

** 聚合函数**

  1. 获得学生总人数:select count(*) from students
  2. 获得学生平均分:select avg(mark) from students
  3. 获得最高成绩:select max(mark) from students
  4. 获得最低成绩:select min(mark) from students
  5. 获得学生总成绩:select sum(mark) from students

3、数据库索引

索引是一个老生常谈的问题,也是面试的重点问题。

①几个概念

  1. 聚集索引(聚簇索引):索引顺序与数据在磁盘上的物理顺序一致,一个数据表只能有一个聚集索引。简单理解:字典上的拼音检索就是个聚集索引,一个字他在拼音目录中靠前,那么他的实际页码也一定靠前。
  2. 非聚集索引(非聚簇索引):索引的顺序与数据在磁盘上的物理顺序不一致,可以有多个。简单理解:部首查字,一个字如果笔画少的话他一定会在部首目录中排在前面,但是他在字典实际的正文中的页码却是不一定的。
  3. 单一索引:在单一一列是建立的索引;
  4. 组合索引(复合索引):在多列上建立的索引(后面会有详细的解释);

②索引的实质
在数据库的官方文档里说,索引(index)是帮助高效找到数据的一种数据结构。
我们来提取关键词:首先,索引是一种数据结构;其次,建索引是为了高效查找。然后我们来想一想,数据结构有哪些?这些数据结构里面有哪些是利于快速查找的?很容易想到的就是二叉查找树,因为可以二分查找。但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 但是现在基本上没有用二叉查找树的,最常使用的是B+Tree。
B+Tree

对于MySql数据库来说,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,下面主要讨论上面提到的MyISAM和InnoDB两个存储引擎的索引实现方式。

③MyISAM的索引实现
MyISAM使用的B+Tree作为索引结构,叶子节点的data域存放的是数据记录的地址,下面是MyISAM的原理如下图:
在这里插入图片描述

假设我们在col1上建立了主索引,可以看到索引文件的叶子节点只是存放了数据的地址值,所以,对于MyISAM来说,主索引和辅助索引在结构上没有什么区别,唯一的不同就是辅助索引的key值是可以重复的,下面我们来看一下如果在col2上建立了辅助索引,其结构如下:
在这里插入图片描述

同样也是一颗B+Tree,data域也是存放数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

④INNODB的索引实现

INNODB也是用B+Tree作为其索引结构,但是他和MyISAM是完全不同的。主要分为以下两个方面:

  1. 数据文件本身就是索引文件。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶子节点data域保存了完整的数据记录。这个索引的key值是数据库的主键,因此INNODB数据文件本身就是一个主索引。

在这里插入图片描述
所以,INNODB数据库必须要有主索引!

  1. 如果按照辅助索引来查找,是先根据辅助索引找到主索引,然后按照主索引去查找数据记录。也就是说对于辅助索引来说,他的叶子节点的data域存放的是他对应的主索引值!

⑤tips

理解了上面的结构以后,这几个tips就很好理解了

  1. INNODB的主键字段不能太长:因为辅助索引都需要引用主索引,如果主索引很大,辅助索引就会变得非常大。
  2. INNODB的主键值最好是单调的:非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,会降低效率。
  3. 为什么索引B+Tree里面会带有顺序访问指针:可以使区间访问的时候更高效。

ps:楼主写的是自己的理解,如果有什么不对的地方,欢迎大家批评指正,多多交流!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值