Mysql数据库
- 1、简单阐述数据库索引?
- 2、什么是事务?
- 3、事务有几大特性?分别是什么?
- 4、简述一下数据库的事务隔离?
- 5、什么是主键索引?
- 6、数据库排序的两关键字是什么?
- 7、char 和 varchar 的区别是什么?
- 8、说一下MySQL常用的存储引擎?
- 9、一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?
- 10、MySQL 的内连接、左连接、右连接有什么区别?
- 11、Mysql聚合函数的使用?
1、简单阐述数据库索引?
索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。
2、什么是事务?
事务可以将一系列的数据操作捆绑成一个整体进行统一的管理,如果某一事务执行成功,则该事务中进行的所有数据均会提交,成为数据库中的永久组成部分。如果事务执行时遇到错误,则就是必须取消或回滚。取消或回滚后,数据将全部恢复到操作前的状态,所以数据更改均被消除。
Mysql 通过事务保证数据的一致性
3、事务有几大特性?分别是什么?
有4个特性ACID
- 原子性(Atomicity):事务是一个完整的操作。
- 一致性(Consisteny):当事务完成时,数据必须处于一致状态。
- 隔离性(Isolation):对数据进行修改的所有并发事务是彼此隔离,这表明事务必须独立,他不应该以任何反射影响其他事务。
- 持久性(Ourability):事务的持久性指不管系统是否发生了故障,事物的处理结果都是永久的。
4、简述一下数据库的事务隔离?
脏读: 表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。
不可重复读: 是指在一个事务内,多次读同一数据。比如,事务A要读取数据两次,先读取了一次,然后事务B更改了此数据,当事务A再读取时与第一次读的不是同一个数据。
幻读: 指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1 条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
- READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
- READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
- REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
- SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
5、什么是主键索引?
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候指定的主键,就会创建主键索引,CREATE INDEX不能用来创建主键索引,使用ALTER TABLE来代替。
6、数据库排序的两关键字是什么?
顺序:ASC
倒序:DESC
7、char 和 varchar 的区别是什么?
- char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。
- chat 优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 非常合适。
- varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
所以,从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,二者使用需要权衡。
8、说一下MySQL常用的存储引擎?
- InnoDB 引擎:mysql 5.1 后默认的数据库引擎,提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。
- MyIASM 引擎:不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。
9、一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?
- 表类型如果是 MyISAM ,那 id 就是 8。
- 表类型如果是 InnoDB,那 id 就是 6。
InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 丢失。
10、MySQL 的内连接、左连接、右连接有什么区别?
内连接关键字:inner join;左连接:left join;右连接:right join。
内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。