1、关于数据库引擎
常用的有两种:MyISAM和InnoDB
区别:
- MyISAM是MySql 5.0以前默认的数据库引擎,拥有很高的插入和查询速度,但是不支持事务,不支持外键,主要用于“读”多的场合;
- InnoDB是事务型数据库首选的数据库引擎,支持ACID事务,支持外键,是MySql 5.5以后默认的数据库引擎。
2、常用Sql语句
增加数据
- insert into 表名 values(列值,与表中列名一一对应);
- insert into 表名(列名1,列名2,……) values(列值1,列值2,……);
删除数据
- 删除表中全部数据:delete from 表名;
- 按条件删除:delete from 表名 where 条件;
更新数据
- update 表名 set 列名 = 新值 where 条件;
查询数据
这是Sql里语法最多,也是最难的一个部分
基本语法是:select 列名 from 表名 where 条件
** 聚合函数**
- 获得学生总人数:select count(*) from students
- 获得学生平均分:select avg(mark) from students
- 获得最高成绩:select max(mark) from students
- 获得最低成绩:select min(mark) from students
- 获得学生总成绩:select sum(mark) from students
3、数据库索引
索引是一个老生常谈的问题,也是面试的重点问题。
①几个概念
- 聚集索引(聚簇索引):索引顺序与数据在磁盘上的物理顺序一致,一个数据表只能有一个聚集索引。简单理解:字典上的拼音检索就是个聚集索引,一个字他在拼音目录中靠前,那么他的实际页码也一定靠前。
- 非聚集索引(非聚簇索引):索引的顺序与数据在磁盘上的物理顺序不一致,可以有多个。简单理解:部首查字,一个字如果笔画少的话他一定会在部首目录中排在前面,但是他在字典实际的正文中的页码却是不一定的。
- 单一索引:在单一一列是建立的索引;
- 组合索引(复合索引):在多列上建立的索引(后面会有详细的解释);
②索引的实质
在数据库的官方文档里说,索引(index)是帮助高效找到数据的一种数据结构。
我们来提取关键词:首先,索引是一种数据结构;其次,建索引是为了高效查找。然后我们来想一想,数据结构有哪些?这些数据结构里面有哪些是利于快速查找的?很容易想到的就是二叉查找树,因为可以二分查找。但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 但是现在基本上没有用二叉查找树的,最常使用的是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是完全不同的。主要分为以下两个方面:
- 数据文件本身就是索引文件。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶子节点data域保存了完整的数据记录。这个索引的key值是数据库的主键,因此INNODB数据文件本身就是一个主索引。
所以,INNODB数据库必须要有主索引!
- 如果按照辅助索引来查找,是先根据辅助索引找到主索引,然后按照主索引去查找数据记录。也就是说对于辅助索引来说,他的叶子节点的data域存放的是他对应的主索引值!
⑤tips
理解了上面的结构以后,这几个tips就很好理解了
- INNODB的主键字段不能太长:因为辅助索引都需要引用主索引,如果主索引很大,辅助索引就会变得非常大。
- INNODB的主键值最好是单调的:非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,会降低效率。
- 为什么索引B+Tree里面会带有顺序访问指针:可以使区间访问的时候更高效。
ps:楼主写的是自己的理解,如果有什么不对的地方,欢迎大家批评指正,多多交流!