1.MySQL索引了解吗?
答:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库 表中的特定信息,可以加快查询速度。InnoDB存储引擎的索引模式底层实现的数据结构是B+树,所有数据都存放在B+树种。
主键索引 primary key
唯一索引 unique key
聚簇索引:又称主键索引,每个表中只有一个聚簇索引,因为索引只能按一种方式就行排序
非聚簇索引:又称普通索引,在InnoDB存储索引中,又叫二级索引
建立索引的好处:加快查询速度,提高系统性能
坏处:创建和维护索引需要时间,占用物理内存
创建索引的方式
自动创建 :mysql会为主键和唯一键的列自动创建索引;
手动创建:
create index index_name on tb_account(name);
索引名字自己起 表名(列名,就是想在哪个列增加索引)
增加唯一索引
alter TABLE 表名 ADD UNIQUE INDEX 自己起的索引名
(列名
);
增加全文索引
alter TABLE 表名 ADD fulltest INDEX 自己起的索引名
(列名
);
2.主键与外键
主键保证实体的完整性,加快数据库操作速度,不接受空值,约束确保唯一数据。
外键保证的是数据的完整性
3.建表
创建表的语法
create table 表名(
列名 数据类型 [约束],
列名 数据类型 [约束],
列名 数据类型 [约束],
[表级约束]
)
CREATE TABLE aaaa
(
id
int(4) NOT NULL,
name
varchar(20) DEFAULT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
4.DDL:数据定义语言;
用来创建,修改,删除数据库对象;
语句有;create,alter,drop,truncate;
drop,truncate,delete区别?
drop:删除表结构和表中所有记录;不可回退;
truncate:清空表中的数据,但不删除表结构,也不可回退;
delete:可以有选择性的删除部分数据,可以回退;
DML:数据操作语言
用来对记录进行CURD 的操作(增删改查)
语句有;insert,update,delete,select
用户权限
修改表结构
语法:alter table 表名 (修改的具体内容)
– 增加一个作者列,插入到bookname之前
alter table tb_book
add author varchar(2) after bookname
–增加一个主键
alter table tb_book
add PRIMARY key(bookid)
–删除主键约束
alter table tb_book
drop primary key
–删除列
alter table tb_book
drop 列名
查看表结构的命令
desc 表名;
2.对SQL优化有什么理解?
show create table TableXX:查看当前表 TableXX 的建表语句
show index from TableXX:查看当前表 TableXX 上的索引
alter table 表名 drop index 自己起的索引名: 删除索引
explain sql语句:分析sql执行的状况
答:一般情况下我们可以通过建立索引来提高查询速度,或者修改 SQL
语句,利用索引下推或者最左前缀原则来加快查询速度。
回表指的是什么?
当使用普通索引查询的方式时,需要先搜索普通索引树,得到其对应的主键值,再到主键索引树搜索一次,叫回表
最左前缀原则
联合索引的最左前缀匹配指的是where条件一定要有联合索引的第一个字段,是否走联合索引与where条件的顺序无关,只与字段有关
索引下推
mysql5.6以后引入的索引下推优化,可以在索引遍历过程中,对索引包含的其余字段先做判断,直接过滤掉不满足的条件记录,减少回表次数,提升查询效率。
索引原则:
2.MySQL事务了解吗?
答:事务是单个逻辑工作单元执行的一系列操作,是一个不可分割的工作单位。满足如下的
原子性(Atomicity):不可在被分割
一致性(Consistency):事务作为一个整体被执行 ,要么都执行,要么全不执行
隔离性(Isolation):一个事务的执行不应影响其他事务的执行
持久性(Durability):事务一旦提交,对数据库的修改应该永久保存
3.如果不做控制,多个事务并发操作数据库会产生哪些问题吗?
脏读:事务 A 读取了事务 B 未提交的数据,由于事务 B 回滚,导致了事务 A 的数据不一致,结果事务 A 出现了脏读;
不可重复读:一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次得到的结果数值不同,因为别的事务更新了该数据,并且提交了事务。
幻读:事务 A 读的时候读出了 N 条记录,事务 B 在事务 A 执行的过程中增加 了 1 条,事务A 再读的时候就变成了 N+1 条,这种情况就叫做幻读。
幻读是指一种结构上的改变,比如条数发生了改变;不可重复读是指读出的数值发生了改变
4.MySQL 数据库事务的隔离级别有哪些?
答:为了避免数据库事务操作中的问题,MySQL 定义了 4 个事务隔离级别,不同的隔离级别对事务的处理不同。
读未提交(Read Uncommitted):都允许三种错误。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。
读已提交(Read Committed):不允许脏读取。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行数据。
可重复读(Repeatable Read):禁止不可重复读和脏读,但是有时可能出现幻读。
序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。
事务的隔离级别越高,对数据的完整性和一致性保证越佳,但是对并发操作的影响也越
大。MySQL事务默认隔离级别是可重复读。
5.数据库日志了解吗?
MySQL 中的日志模块主要有 binlog(归档日志)
relay binlog文件(中继日志)
6.数据库锁了解吗?
答:MySQL 数据库的锁分为表级锁和行级锁。
从数据库角度看,行级锁又可以分为独占锁和共享锁。
独占锁,独占锁锁定的资源只允许进行锁定操作的程序使用, 其它任何对它的操作均不会被接受。
共享锁,其锁定的资源可以被其他用户读取,但不能被修改。
7.MySQL 中的死锁是如何形成的?如何解决死锁问题?在这里插入代码片
答:MySQL 中的死锁主要是多个事务使用行级锁对同一行数据加锁造成的。
业务逻辑上的死锁解决方案:
指定锁的获取顺序;
大事务拆分成各个小事务;
在同一个事务中,一次锁定尽量多的资源,减少死锁概率;
给表建立合适的索引以及降低事务的隔离级别等;
9.主从库读写分离
主库,当服务器向主myqsl库发送一个请求,这个操作会执行并存储在一个二进制文件binlog
中(存储了所有的sql语句),binlog是自带的,只会记录写(增删改)操作
从库读操作,有两个线程一个IO Thread(从主库的binlog文件拷贝,复制到从库自己的relay binlog文件(中继日志,中间的转载的日志)中),再由第二个线程SQL Thread从relay binlog中读取sql语句并执行
这样就是主从同步,主库增删改,从库不允许增删给,只能读
b## 10.数据库连接池
Druid c3po dbutils
11.jdbc连接步骤
①加载驱动
②获取连接
③创建statement对象
④写sql语句执行
⑤关闭连接
12.什么事预编译,以及他的好处?
预编译:DB不会在进行编译,而是直接执行编译过的sql
好处:可以使用占位符,防止sql注入,效率更高
13.mysql的存储引擎
数据库中char和varchar的区别为:长度不同、效率不同、存储不同。
一、长度不同
1、char类型:char类型的长度是固定的。
2、varchar类型:varchar类型的长度是可变的。
二、效率不同
1、char类型:char类型每次修改的数据长度相同,效率更高。
2、varchar类型:varchar类型每次修改的数据长度不同,效率更低。