1.mysql中innodb和myisam的区别?

  1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

  2. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;

    3. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。

    4. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。
    MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

  3. 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特性?

  1. 原子性
    原子性是指一个事务是一个不可再分割的工作单位,事务中的操作要么都执行,要么都不执行
    例如:
    A给B转账,如果B的账户操作失败,则本次交易失败,A和B的账户都不会进行修改。

  2. 一致性
    一致性是指在执行一个事务前和后,数据库的完整性约束没有被破坏。也就是说事务不能破坏数据库的完整性以及业务逻辑的一致性。

例如:

业务逻辑一致性:A给B转账,无论是否操作成功,两者的账户余额之和应该是不变的。

数据库完整性:数据库的约束关系应该是正确的,例如唯一索引,主键等。

  1. 隔离性
    隔离性是指多个事务并发时,每个事务应该是隔离的,一个事务不应影响其他事务的运行效果。
    在并发环境当中,当不同的事务访问相同的数据时,每个事务都有各自的完整的数据空间,由于并发事务所做的修改必须与并发的其他事务的修改隔离,所以事务查看数据更新时,数据所处的状态要么是另一个事务开始前的状态,要么就是另一个事务结束后的状态,不会查看到中间状态数据。

事务最复杂的问题都是由隔离性引起的,但是完全的隔离是不现实的,完全的隔离要求数据库同一时间只能执行一个事务,这样会严重影响性能。

  1. 持久性
    持久性意味着事务执行完成后,该事务对数据库的更改便持久到了数据库中,这个更改是永久的。


    4.脏读、幻读、不可重复读?

事务并发问题
要了解事务的隔离级别,那么就要先了解事务并发会面临的问题

  1. 脏读:事务A读取了事务B的更新的数据,但是事务B回滚了,导致A读取的为脏数据。

  2. 不可重复读:事务A读取同一数据两次(未提交的数据),但是在两次之间事务B对该数据进行了修改并提交,导致事务A读取两次读取不一致

  3. 幻读:所谓幻读,就是同一个事务,连续做两次当前读 (例如: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$

  1. 删除
    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用来作为聚集索引。

  1. 2.唯一索引<br />索引列的值必须唯一,但允许有空值。若是组合 索引,则列值的组合必须唯一。不允许有空值
  2. 3.复合索引(最佳做匹配原则)<br />在单个列上创建的索引我们称为单列索引,在2个以上的列上创建的索引称为复合索引。在单个列上创建索引相对简单,通常只需要考虑列的选择率即可,选择性越好,代表数据越分散,创建出来的索引性能也就更好。<br /> 4.普通索引<br />是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值<br /> 覆盖索引<br /> 语法格式:<br /> 1.创建

8.MySQL优化