目录
加油,一起努力 !!!
说一下ACID是什么?
Atomicity(原子性):
一个事物(transaction)中的所有操作,或者全部完成,或则全部不完成,不会结束在中间某个环节。事物在执行u工程中发生错误,会被恢复(Rollback)到事物开始前的状态,就像者个事物从来没有执行过一样。即,事物不可分割,不可约简。
Consistency(一致性):
在事物开始之前和事物结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束,触发器,级联回滚等。
Isolation(隔离性):
数据库允许多个并发事物同时对其数据进行读写和修改的能力,隔离性可以防止多个四五并发执行时由于交叉执行而导致数据的不一致。事物隔离分为不同级别,包括未提交(Readuncommitted),读提交(read committed),可重复读(repeatable read)和串行化(Serializable)。
Durability(持久性):
事物处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
MySQL索引时怎样实现的?
索引时满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
具体来说MySQL中索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是B+树实现的,B+树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更号的。
怎么验证MySQL的索引是否满足需求?
使用explain查看SQL是否执行查询语句的,从而分析你的索引是否满足需求。
explain语法:explain select * from table where type = 1;
说一下数据库的事物隔离?
MySQL的事物隔离是在MySQL.ini配置文件里添加的,在文件的最后添加:
transaction-icolation = REPEATABLE-READ
可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE。
- READ-UNCOMMITTED:未提交读,最低隔离级别、事物未提交前、就可被其他事物读取(会出现幻读、脏读、不可重复读)。
- READ-COMMITTED:提交读,代价最高
- REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事物开始时候的内容时一致,禁止读取到别的事物未提交的数据(会照成幻读)。
- SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读,不可重复读,幻读。
**脏读:**表示一个事物能够读取另一个中还未提交的数据。比如某个事物尝试插入记录 A ,此时该事物还未提交,然后另一个事务尝试读取了记录A。
**不可重复读:**是指在一个事物内,多次读取同一数据。
**幻读:**指同一个事务内多次查询返回的结果集不一样。比如同一个事务A第一次查询时候有n条记录,但是第二次同等条件下查询却有n+1条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
说一下MySQL常用的引擎?
**InnoDB:**InnoDB引擎提供了对数据库acid事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL运行的时候,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保持表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所有在并发度较高的场景下使用会提升效率的。
**MyIASM:**MySQL的默认引擎,但不提供事务的支持,也不支持行级锁和外键,因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和InnoDB不同的时,MyIASM引擎时保存了表的行数,于是当进行select count(*) table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将MyIASM作为数据库引擎的首选。
说一下MySQL的行锁和表锁?
MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。
表锁:开销小,加锁快,不会出现死锁。锁定颗粒度大,发生锁冲突的概率最高,并发量最低 。
行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率小,并发度最高。
说一下乐观锁和悲观锁
**乐观锁:**每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断以下在此期间别人有没有去更新这个数据。
**悲观锁:**每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。
数据库的乐观锁需要自己实现,在表里面添加一个version字段,每次修改成功值加1,这样每次修改的时候先对比一下,自己拥有的version和数据库现在version和数据库现在的version是否支持,如果不一致就不修改,这样就实现了乐观锁
如何做MySQL的性能优化?
- 为搜索字段创建索引
- 避免使用select * ,列出需要查询的字段
- 垂直分割分表
- 选择正确的存储引擎