1.关系型数据库和非关系型数据库
关系型数据库:建立在关系模型上的数据库。关系模型表明了所存储的数据之间的联系(一对一、一对多、多对多),可简单的理解为二维表格模型。
优点:
1.二维表结构贴近于正常开发逻辑
2.支持通用的sql
3.支持事务,保证事务的正确执行,同时提供了事务的恢复、回滚、并发控制、死锁
4.数据保存于磁盘中,安全
缺点:
1.高并发读写能力差
2.海量数据情况下,读写效率低
3.可扩展性不足
非关系型数据库:数据以对象的形式存储于数据库中,而对象之间的关系通过每个对象自身的属性决定的。
常见的nosql数据库:
1.键值数据库:redis、riak
2.文档数据库:MongDB
优点:
1.存储数据类型广泛
2.速度快、效率高,可使用硬盘或其他存储器作为载体,但关系型数据库只能使用硬盘。
3.易处理海量数据和维护
4.数据分布式处理
缺点:
1.不支持sql
2.没有事务处理,无法保证数据完整性和安全性
3.复杂的关联表不易实现
2.mysql架构
连接器:身份验证、权限验证
查询缓存:执行查询语句时,会先查询缓存
分析器:未命中缓存,sql就会经过分析器,检查sql语句是否正确
优化器:按照sql认为最优的方案执行
执行器:执行语句,从存储引擎返回数据。执行语句之前先判断是否有权限,没权限就会报错
执行引擎:负责数据的读取和存储,采用插件式架构,支持InnoDB、MyISAM、Memory等多种存储引擎
3.MyISAM和InnoDB
1.InnoDB支持事务,MYISAM不支持
2.MYISAM适合查询和插入为主的应用,InnoDB适合频繁修改和安全性较高的应用
3.删除表时,InnoDB是一行一行删除,效率较慢,MYISAM是重建表
4.InnoDB支持行锁
4.行锁和表锁
表锁:锁定整张表,不依赖存储引擎,无论什么mysql的存储引擎,表策略都是一样。同时锁定整张表,很好的避免了死锁问题。但是锁粒度较大,导致并发率降低。
行锁:记录锁,锁住某一行。其只在存储引擎实现。
读锁/共享锁:允许事务读(select)数据
写锁/排他锁:允许事务删除(delete)或更新(update)数据
读锁和写锁可以加在表或者行上。
读锁是共享的,多个事务在同一时刻读取统一资源,互不干扰。
写锁是排他的,一个写锁会阻塞其他的读锁和写锁,确保给定时间中,只有一个事务执行写入,防止其他用户读取正在写入的同一资源。
加表锁:
1.隐式锁定:常见的DDL语句(create、drop、alter),InnoDB会自动给相应的表加表级锁。
2.显示锁定:执行SQL语句,对某个表明确添加表锁:
lock table user read(write)
加行锁:
1.隐式:
1>常见的DML语句(update、delete、insert),InnoDB自动添加行锁。
2>普通情况下select不会添加任何锁,在serializable隔离级别下,加行级读锁
2.显示:
1>SELECT * FROM table_name WHERE ... FOR UPDATE,行级写锁
2>SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE,行级读锁
InnoDB的行级锁是基于索引,当索引失效会自动升级为表锁。