- 1.mysql中innodb和myisam的区别?
2.SQL语句分类?
3.事务的ACID特性?
4.脏读、幻读、不可重复读?
5.内连接、左外、右外、子查询的意义和差异?">
5.内连接、左外、右外、子查询的意义和差异?- 6.谈谈数据库事务的理解
7. MySQL的进阶- 8.MySQL优化
1.mysql中innodb和myisam的区别?
InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。
MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
2.SQL语句分类?目前SQL的分类: 1.DDL:数据定义语言 关键字:create drop alter 2.DML:数据操作语言 关键字:insert update delete 3.DQL:数据查询语言 关键字:select 4.DCL:数据控制语言 关键字:grant revoke 5.TPL:数据事务语言 关键字:begin transaction、commit 、rollback 6.CCL:指针控制语言 关键字:cursor 游标
3.事务的ACID特性?
原子性
原子性是指一个事务是一个不可再分割的工作单位,事务中的操作要么都执行,要么都不执行
例如:
A给B转账,如果B的账户操作失败,则本次交易失败,A和B的账户都不会进行修改。一致性
一致性是指在执行一个事务前和后,数据库的完整性约束没有被破坏。也就是说事务不能破坏数据库的完整性以及业务逻辑的一致性。
例如:
业务逻辑一致性:A给B转账,无论是否操作成功,两者的账户余额之和应该是不变的。
数据库完整性:数据库的约束关系应该是正确的,例如唯一索引,主键等。
- 隔离性
隔离性是指多个事务并发时,每个事务应该是隔离的,一个事务不应影响其他事务的运行效果。
在并发环境当中,当不同的事务访问相同的数据时,每个事务都有各自的完整的数据空间,由于并发事务所做的修改必须与并发的其他事务的修改隔离,所以事务查看数据更新时,数据所处的状态要么是另一个事务开始前的状态,要么就是另一个事务结束后的状态,不会查看到中间状态数据。
事务最复杂的问题都是由隔离性引起的,但是完全的隔离是不现实的,完全的隔离要求数据库同一时间只能执行一个事务,这样会严重影响性能。
事务并发问题
要了解事务的隔离级别,那么就要先了解事务并发会面临的问题
脏读:事务A读取了事务B的更新的数据,但是事务B回滚了,导致A读取的为脏数据。
不可重复读:事务A读取同一数据两次(未提交的数据),但是在两次之间事务B对该数据进行了修改并提交,导致事务A读取两次读取不一致
幻读:所谓幻读,就是同一个事务,连续做两次当前读 (例如:select * from t1 where id = 10 for update;),那么这两次当前读返回的是不相同的记录
注意:不可重复读和幻读很容易混淆,不可重复读针对的时数据的修改,幻读针对的时数据的新增和删除。解决不可重复读问题只需要给对应记录上行锁,而解决幻读需要对表加锁。
5.内连接、左外、右外、子查询的意义和差异?
- 内连接(inner join):只返回两个表中连接字段相等的记录。
- 左连接(left join):返回包括左表中的所有记录和右表中连接字段相等的记录。
- 右连接(right join):返回包括右表中的所有记录和左表中连接字段相等的记录。
- 子查询:允许把一个查询嵌套在另一个查询当中。 子查询,又叫内部查询,相对于 内部查询 ,包含内部查询的就称为 外部查询 。
6.谈谈数据库事务的理解
事务就是同生共死,要么都成功,要么都失败。
当SQL语句出现了两次及以上的DML我们就开启数据库事务。
7. MySQL的进阶
1. MySQL视图
视图就是对查询语句的封装,作用跟表一样
操作视图跟操作表一样
语法格式:
1.定义:create(可瑞累) view(为右) 视图名称 as 查询语句
2.删除:drop(低rua普) view(为右) 视图名称
3.使用:跟使用表一样
2. 触发器
触发器就是满足一定条件或操作类型为DML的时候自动执行自定义的SQL语句
分类:
1. 类级触发器
2. 行级触发器
时间条件:
Before(比fao无)
After(嗷福特)
监听的操作类型:
Insert
Update
Delete
语法:
1. 创建
— 重新定义结束符
delimiter $
— 定义:实现stu表新增数据的时候,自动新增日志
create trigger 触发器名称 after|before insert|update|delete on 表名 for each row
begin
自定义sql语句
end$
- 删除
drop trigger 触发器名称
3. 函数
自带有5种函数
1.算数运算:
2.字符串:
3.日期:
4.聚合函数:
5.其他:
4.存储过程
有三种:
1.输入-只读 in
2.输出-写出 out
3.输入输出-读写 in out
5.分支循环
6. 索引
定义:一种可以提高查询效率的结构,如果把表比喻成书,那么索引就是书的目录
特点:提高查询效率(索引生效),降低DML操作的效率
底层实现:B+Tree(InnoDB引擎)
分类:
1.主键索引(聚簇索引)
InnoDB存储引擎的表会存在主键(唯一非null),如果建表的时候没有指定主键,则会使用第一非空的唯一索引作为聚集索引,否则InnoDB会自动帮你创建一个不可见的、长度为6字节的row_id用来作为聚集索引。
2.唯一索引<br />索引列的值必须唯一,但允许有空值。若是组合 索引,则列值的组合必须唯一。不允许有空值
3.复合索引(最佳做匹配原则)<br />在单个列上创建的索引我们称为单列索引,在2个以上的列上创建的索引称为复合索引。在单个列上创建索引相对简单,通常只需要考虑列的选择率即可,选择性越好,代表数据越分散,创建出来的索引性能也就更好。<br /> 4.普通索引<br />是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值<br /> 覆盖索引<br /> 语法格式:<br /> 1.创建