MySQL 的 MyISAM 与 InnoDB 两种存储引擎在,事务、锁级别,各自的适用场景?
事务处理上方面
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比 InnoDB 类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback) 和崩溃修复能力(crash recovery capabilities) 的事务安全(transaction-safe (ACID compliant))型表。
锁级别
MyISAM:只支持表级锁,用户在操作 MyISAM 表时,select,update,delete,insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是 innodb 的最大特色。行锁大幅度提高了多用户并发操作的新能。但是 InnoDB 的行锁,只是在 WHERE 的主键是有效的,非主键的 WHERE 都会锁全表的。
非关系型数据库和关系型数据库区别,优势比较
非关系型数据库的优势:
性能:NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过 SQL 层的解析,所以性能非常高。
可扩展性:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。 关系型数据库的优势:
复杂查询:可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询。事务支持:使得对于安全性能很高的数据访问要求得以实现。
数据库的五大范式
第一范式:(确保每列保持原子性)所有字段值都是不可分解的原子值。
第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说 明该数据库表满足了第一范式。
第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址” 这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访 问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算 满足了数据库的第一范式,如下表所示。
上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常 方便,也提高了数据库的性能。
第二范式:(确保表中的每列都和主键相关)在一个数据库表中,一个表中只能保存一种数 据,不可以把多种数据保存在同一张数据库表中。
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和 主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数 据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号 作为数据库表的联合主键。
第三范式:(确保每列都和主键列直接相关,而不是间接相关) 数据表中的每一列数据都和主键直接相关,而不能间接相关。
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关 系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。
BCNF:符合 3NF,并且,主属性不依赖于主属性。
若关系模式属于第二范式,且每个属性都不传递依赖于键码,则 R 属于 BC 范式。
通常 BC 范式的条件有多种等价的表述:每个非平凡依赖的左边必须包含键码;每个决定因素必须包含键码。
BC 范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC
范式的关系都必然满足第三范式。
还可以这么说:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码 都是单属性,则该关系自然达到 BC 范式。
一般,一个数据库设计符合 3NF 或 BCNF 就可以了。第四范式:要求把同一表内的多对多关系删除。第五范式:从最终结构重新建立原始结构。
什么是内连接、外连接、交叉连结、笛卡尔积等?
内连接: 只连接匹配的行
左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
例如 1:
SELECT a.,b. FROM luntan LEFT JOIN usertable as b ON a.username=b.username
例如 2:
SELECT a.,b. FROM city as a FULL OUTER JOIN user as b ON a.username=b.username
全外连接: 包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行。交叉连接: 生成笛卡尔积-它不使用任何匹配或者选取条件,而是直接将一个数据源中
的每个行与另一个数据源的每个行都一一匹配
SQL 语言分类
数据查询语言 DQL 数据操纵语言 DML 数据定义语言 DDL 数据控制语言 DCL。