什么是MySQL?
MySQL 是一种关系型数据库,主要用于持久化存储我们的系统中的一些数据比如用户信息。
MySQL 字段类型
可以简单分为三大类:数值类型、字符串类型、日期时间类型
什么是事务?事务基本特性ACID?
事务是逻辑上的一组操作,要么都执行,要么都不执行。
- 原子性(
Atomicity):事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用。 - 一致性(
Consistency):执行事务前后,数据保持一致。 - 隔离性(
Isolation):并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。 - 持久性(
Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
数据库中并发一致性问题?并发的事务
- 脏读:一个事务读取了数据并对其进行修改,但事务还没有提交,此时,另一个事务读取了还未提交的修改(这个修改对其他事务来说是可见的)后的数据,但是第一个事务突然回滚了,导致修改的数据没有提交到数据库中,那么第二个事务读取到的数据就是脏数据,这就是脏读。
- 丢失修改:两个事务读取了同一个数据,第一个事务修改了数据,第二个事务也修改了数据,此时第一个数据会被第二个覆盖,导致了第一个数据的丢失,这就是丢失修改。
- 不可重复读:第一个事务读取了数据,但事务还没有结束,第二个事务就修改了该数据,当第一个事务再次读取数据的时候,此时的数据和第一次读取的数据不一样,这就是不可重复读。
- 幻影读:第一个事务在读取某个范围数据的时候,但事务还没有结束,第二个事务在这个范围里面插入了新的数据,当第一个事务再次读取这个范围数据的时候,此时的数据和第一次读取的数据不一样,这就是幻影读。
MyISAM 和 InnoDB 引擎有什么区别?
- 是否支持行级锁
- 是否支持事务
- 是否支持外键
- 是否支持数据库异常崩溃后的安全恢复
- 是否支持MVCC
- 索引实现不一样
- 性能有差别。
事务的隔离等级?
- READ UNCOMMITTED(读取未提交)事务中的修改,即使没有提交,对其它事务也是可见的。可能会导致脏读、幻影读或不可重复读。
- READ COMMITTED(读取已提交)事务的修改,在提交之前,对其它事务是不可见的。可能会导致幻影读或不可重复读。
- REPEATABLE READ(可重复读)保证在同一个事务中多次读取同样数据的结果是一样的。可能会导致幻影读。MySQL InnoDB 存储引擎的默认支持的隔离级别。
- SERIALIZABLIE(可串行化)强制事务串行执行。
读写分离
为什么要读写分离
目的是读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上。
如何实现读写分离
- 一般的步骤是:第一步部署多台数据库,选择一台作为主数据库,其他一台或多台作为从数据库。第二步就是保证主数据库和从数据库的数据是实时同步的,就是主从复制。第三步,服务器将写请求交给主数据库,读请求交给从数据库。
- 项目的实现:1.代理的方法:在应用和数据之间加入代理,应用的请求将由代理管理,并路由到读写对应的数据库中。2.组件的方法:
Sharding-JDBC,运用第三方组件来帮助实现路由读写请求。
主从复制的原理
主要涉及三个线程: binlog 线程、I/O 线程和 SQL 线程。
主从的延迟怎么解决
主库写入数据后,从库的数据同步是需要时间的,这就产生了主从延迟,解决方式就强制走主库。
分库分表
为什么要分库分表
解决数据库存储的压力