数据库常用面试题(简易版)
说一下Myisam 和 InnoDB之间的区别
首先 Myisam 不支持事务和行级锁 一般用于大量查询和少量插入 不支持外键 而且索引和数据是分开储存的
InnoDB 是基于聚簇索引建立的 和Myisam相反 它支持事务 外键 并且通过MVCC来控制控制高并发 索引和数据在一块
说一下Mysql索引有哪些 聚簇索引和非聚簇索引又分别是什么
主要有hash索引 和 B+ 树索引
B+ 树索引:ID唯一为节点 而叶子节点包含数据 那么这种索引和数据在一起储存的索引叫做聚簇索引 (非聚簇索引就是 只包含主键id)
注意:架设没有位置主键 InnoDB会选择一个非空的索引代替
说一下什么是覆盖索引和回表
覆盖索引指的是 再一次查询过程中 索引里面包含或者覆盖着所有需要查询的数据 我们就称之为覆盖索引 而不在需要回表查询 要确定一个表是否是覆盖索引我们需要explan sql语句查看
锁的类型有哪些
MySQL的锁分为排他锁和共享锁 也称为读锁和写锁
读锁是共享的 这个时候只能读 不能写
写锁是排他的 分为行锁和表锁
行锁又分为乐观锁和悲观锁
说一下事物的基本特点 和隔离级别
事务的特点是ACID
A 是事物的原子性 值得是一个事物的操作 要么成功 那么失败
C 一致性 指的是事务的一个状态转换到另外一个状态
I 隔离性 指的是事务在进行最后的提交之前 不会被其他事务所看到
D 持久性 一旦事务提交之后那么对事务的操作 就会永久的保存到数据库中
- 读未提交 可能会读到其他的未提交的数据 也叫做脏读
- 读已提交 俩次读取的结果不一样 他解决了脏读 (不可重复读)
- 可重复读 这是mysql默认级别 每次读取的结果都一样 (幻读)
- 串行化 一般不会使用他会给每一行加锁 这样的话会造成大量的锁竞争问题 相应的他解决了可重复读的问题
ACID靠什么保证
A 日志
C 代码层面
I MVCC来保证
D redoLog
MVCC工作原理
他通过控制版本来查询小于或者等于当前版本 删除为空或者大于当前版本
间隙锁
为了解决幻读的问题 结合MVCC来阐述
数据量级 分库分表怎么做
先垂直 在水平
分表之后的ID怎么确保唯一性
因为我们确定的主键都是唯一自增的 分表之后肯定会有冲突
设置步长 比如1024张表 那么我们就设置0~1024的基础步长 那么就解决了
//选择排序
int array[] = {1,2,3,4,6,5};
for (int i = 0; i < 6; i++){
int minkey = array[i];
for(int j = i + 1; j<6; j++){
if (minkey[] < array[]){
int tamp = array[j];
array[j] = minkey;
minkey[i] = tamp;
}
}
array[] = minkey[];
}
什么是springBoot
用来简化开发
用特殊的spring引用main方法
内嵌tomcat
自动配置
简化maven配置
连接数据库
-- 展示所有的表
show databases;
-- 使用某张表
use school;
-- 查看所有的表
show tables;
-- 查看表中的所有数据
describe city;
-- 创建一个数据库
create database Game;
-- 推出 exit
数据库管理语言
DDL 定义
DML 操作
DQL 查询
DCL 控制
操作数据库
1 创建数据库
create databases [if not exists] game;
2 删除数据库
drop databases [if exists] game;
3 使用数据库
use game;
4 查看数据库
数据库的列类型
数据库的字段属性
UNSIGNED
- 无符号的整数
- 不能声明为负数
ZEROFILL
- o填充
- 不足的位数用0添加
自增
- 通常设置为唯一的整数
- 也可以自己设计
DESC 显示表的结构
修改表名
alter table 旧表名 rename as 旧表名
增加表的字段
alter table 表名 add 字段名 列属性
修改表的字段
修改约束
alter table game modify age varchar(10);
修改表名
alter table game change age age1 INT(10);
删除表的字段
alter table game drop age1;
删除表
Mysql的数据管理
外键
FK_ 设置外键名
CONSTRAION FK_ 设置外键名
;
DML语言
insert
insert into game ([字段1,字段2,字段3]) values ('值1,值2,值3')
update
update `game` set `name` = 'jdx' where id =1;
```sql
delete from game where id = 3;
## DQL语言
```sql
select * from game
--查询指定字段
select `name` ,`age` from game;
--别名
select `name` as `姓名`,`age` as `年龄` from agme;
--函数 Concat(a,b)
select concat(`姓名:` , name ) as 新名字 from game;
--去重函数函数
select distinct 'name' from game;
--查询系统的版本
select version();
===================================where======================================
-- 模糊查询 (比较运算符)
select `name`,`age` from game
where age between 20 and 24;
连表查询
join on 链接查询
where 等职查询
自联接(拆表)
--limit
limit(起始值,该页的大小)
sql 常用函数
ABS(绝对值)
floor(向下取整)
RAND (随机数)
SING (返回参数的符号)
CHAR_String (字符串长度)
concat(拼接字符串)
INSTER(查询替换)
UPPER(大写)
REPALCE(替换原来的字符串)
NOW(当前时间)