MySQL
MySQL是最流行的关系型数据库管理系统之一。关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库中,这样就增加了速度并提高了灵活性。体积小,速度快,总体拥有成本低,并且开放源码。
附加:关系型数据库和非关系型数据库的区别:
关系型数据库:最典型的数据结构是表,是二维表和其之间的联系所组成的数据组织(MySQL,Oracle,sqlite,SQL server)
优点:
- 易于维护,都是使用表结构,格式一致
- 使用方便,SQL语言通用,可用于复杂查询
- 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询
缺点:
- 读写性能比较差,尤其是海量数据的高效率读写
- 固定的表结构,灵活性稍微欠缺
- 高并发读写需求
非关系型数据库:一种数据结构化存储方法的集合,可以是文档或者键值对(mongoDB,redis,hbase)
优点:
- 格式灵活,存储数据的格式可以是键值对形式,文档形式,图片形式等等
- 速度快,nosql可以使用硬盘或者随机存储器作为载体,关系型数据库只能使用硬盘
- 高扩展性
- 成本低:nosql部署简单,基本上都是开源软件
缺点:
- 不支持sql,学习和使用成本较高
- 无事务处理
- 数据结构相对复杂,复杂查询方面欠缺
存储引擎
MyISAM是MySQL5.0之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务。
InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定,Mysql5.5起成为默认数据库引擎
merge将一定数量的MyISAM表联合成一个整体,在超大规模数据存储时很有用
事务
数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成
事务的特性(ACID)
原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行
一致性:事务应确保数据库的状态从一个一致状态变成另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束
隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行
持久性:已被提交的事务对数据库的修改应该永久保存在数据库中
索引功能
索引是一种特殊的文件,他们包含着对数据表里所有记录的引用指针。索引不是万能的,索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程度上弥补这一缺陷,许多 SQL 命令都有一个 DELAY_KEY_WRITE 项。这个选项的作用是暂时制止 MySQL 在该命令每插入一条新记录和每修改一条现有之后立刻对索引进行刷新,对索引的刷新将等到全部记录插入/修改完毕之后再进行。在需要把许多新记录插入某个数据表的场合,DELAY_KEY_WRITE 选项的作用将非常明显。另外,索引还会在硬盘上占用相当大的空间。因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
索引类别
普通索引、外键索引、复合索引、主索引
优点
- MySQL 是开源的,所以你不需要支付额外的费用。
- MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
- MySQL 使用标准的 SQL 数据语言形式。
- MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
- MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
- MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
MySQL与Oracle的区别
- MySQL默认是自动提交,Oracle默认不自动提交,需要用户手动提交,需要写commit,指令或者点击commit
- MySQL直接在sql与剧中写limit就可以实现分页,Oracle需要用到伪列rownum和嵌套查询
- MySQL是read commited的隔离级别,而Oracle是repeated read的隔离级别,同时二者都支持串行化事务隔离级别
- MySQL在innodb存储引擎的行级锁的情况下才可支持事务,oracle完全支持事务
- MySQL在数据库更新或者重启,则会丢失数据,Oracle把提交的sql操作栈写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复
- MySQL以表级锁为主,对资源锁定的粒度很大,Oracle使用行级锁
- MySQL逻辑备份时要锁定数据,才能保证备份的数据是一致的,影响业务正常的dml使用,Oracle逻辑备份时不需要锁定数据,且备份的数据是一致的
- MySQL管理工具较少,Linux下的管理工具的安装时还要安装额外的包,有一定的复杂性,Oracle有多种成熟的命令行,图形界面,web管理工具,还有很多第三方的管理工具,管理极其方便高效
- MySQL时轻量级数据库,并且免费,没有服务恢复数据。Oracle是重量型数据库,收费
- MySql一般使用自动增长类型,在创建表的时候只要指定表的主键为auto increment,插入记录时就不需要再为主键添加记录了,主键会自动增长。Oracle中没有自动增长,主键一般使用序列,插入记录时将序列号的下一值付给该字段即可,只是ORM框架只是需要native主键生成策略即可
- MySql里可以使用双引号来包起字符串,Oracle里要使用单引号包起字符串。
Mysql 中 myisam 与 innodb 的区别
1、 存储结构
MyISAM:每个 MyISAM 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指 出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),
InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB。
2、 存储空间
MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾 不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
3、 事务支持
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比 InnoDB 类型更快,但是不提供事务 支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和 崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
4、 CURD 操作
MyISAM:如果执行大量的 SELECT,MyISAM 是更好的选择。(因为没有支持行级锁),在增删的 时候需要锁定整个表格,效率会低一些。相关的是 innodb 支持行级锁,删除插入的时候只需要锁定改 行就行,效率较高
InnoDB:如果你的数据执行大量的 INSERT 或 UPDATE,出于性能方面的考虑,应该使用 InnoDB 表。DELETE 从性能上 InnoDB 更优,但 DELETE FROM table 时,InnoDB 不会重新建立表,而是一 行一行的删除,在 innodb 上如果要清空保存有大量数据的表,最好使用 truncate table 这个命令。
5、 外键
MyISAM:不支持
InnoDB:支持