一、什么是数据库
说道什么是数据库,我们就从数据管理的发展阶段说起,最原始的数据管理比如我们从电视上看到某个大宅院都有一名管家,用来管理家庭的物质开销,比如把每月使用银两记录到一个小本本上,其实这就是人工对数据的管理。但是人工管理数据有一定的缺陷,例如数据不能够长期保存,数据不能够共享等。随着时代的发展有了文件系统对数据的管理,但是文件对数据的管理缺点也是很明显的。
(1)文件的安全性问题
(2)文件不利于查询和对数据的管理
(3)文件不利于存放海量数据
(4)文件在程序中控制不方便
为了解决上述问题,有大佬设计出来了有利于数据的管理——数据库系统。与文件管理系统和人工管理系统相比,数据库系统特点主要有以下几点:
(1)数据结构化
数据库系统实现对整体数据的结构化,这是数据库的主要特征,也是数据库系统与文件系统的本质区别。在文件系统中文件是为某一个具体应用服务,文件的逻辑结构是为具体的应用设计的,因此想要对文件中的数据再增加一些新的应用会很困难。而且数据的逻辑结构发生改变,应用程序的逻辑结构也要发生改变,所以数据依赖于应用程序。如下图
所谓数据整体结构化,就是指数据库中的数据不再是针对某一应用,而是面向整个组织或者企业。
(2)数据的共享性高、冗余度低且扩展性高
由于数据库系统是从整体的角度来看待数据,数据不再面向某个应用而是面向整个系统,所以可以再多个用户、多个应用之间共享。数据共享可以大大减小数据的冗余,节约存储空间。由于面向整个系统,是有结构的数据,不仅可以被多个应用共享,而且容易增加新的应用,所以易于扩充。
(3)数据独立性高
包括物理独立性和逻辑独立性。物理独立性是指应用程序和数据在数据库中物理存储是相互独立的,也就是数据在数据库中怎么存储的是由数据库管理系统决定的而与应用程序无关。逻辑独立性是指用户的应用程序与数据库的逻辑结构是相互独立的,也即是说数据的逻辑结构改变时应用程序可以不发生变化。
(4)数据由数据库管理系统统一管理
数据库的共享会带来数据库的安全隐患,而数据库中的共享是并发的共享,所以可能多个用户在操作同一数据,这就可能造成共享安全隐患,所以数据库管理系统必须提供安全保障。
- 数据的安全性保护
- 数据的完整性检查
- 并发控制
- 数据库恢复
数据库系统中应用程序和数据的对应关系,如下图
数据库系统组成:DB(数据库)、DBMS(数据库管理系统)、DBA(数据库管理员)、应用程序
二、主流数据库
(1)SQL Sever:微软产品,主要适用于中大型项目
(2)Oracle:甲骨文产品,适合大型项目,复杂的业务逻辑
(3)MySQL:甲骨文产品,最受欢迎的数据库之一
三、服务器、数据库和表的关系
所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据 库,一般开发人员会针对每一个应用创建一个数据库。
为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
数据库服务器、数据库和表的关系如下:
数据库的简单使用:
(1)查看数据库
show databases;
(2)创建数据库
create database test1;
(3)使用数据库
use test1;
(4)创建数据库表
create table student(
id int,
name varchar(20),
gender varchar(2)
);
(5)查看数据库表
show tables;
(6)表中插入数据
insert into student(id,name,gender) values(1,'zhangsan','男');
insert into student(id,name,gender) values(2,'lisi','男');
insert into student(id,name,gender) values(3,'xiaohong','女');
(7)查询表中数据
select * from student;
(8)结果展示
四、MySQL架构
mysql是一个可移植的数据库,在当前几乎所有的操作系统上都可以使用。当然各种操作系统底层原理实现都不一样,但是MySQL是以保证在不同的操作系统上其物理结构一致性。
1.最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
2.第二层架构主要完成大多少的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
3.存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
4.数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
存储引擎:DBMS如何存储数据,如何为存储的数据建立索引和如何更新、查询数据等技术。
MySQL支持插件式存储引擎,支持多种存储引擎
插件式的存储引擎架构将查询处理和其他的系统任务以及系统的存储提取相分离,这种架构可以根据用户的不同业务需求,选择合适的存储引擎。
查看MySQL默认存储引擎:
show engines;
各种存储引擎对比:
主要是InnoDB、MyISAM、Memory(三者只有InnoDB支持事务和外键)
InnoDB引擎:
1.将数据存储在表空间中,表空间由一系列的数据文件组成,由InnoDB管理;
2.支持每个表的数据和索引存放在单独文件中(innodb_file_per_table);
3.支持事务,采用MVCC来控制并发,并实现标准的4个事务隔离级别,支持外键;
4.索引基于聚簇索引建立,对于主键查询有较高性能;
5.数据文件的平台无关性,支持数据在不同的架构平台移植;
6.能够通过一些工具支持真正的热备。如XtraBackup等;
7.内部进行自身优化如采取可预测性预读,能够自动在内存中创建hash索引等。
MyISAM引擎:
1.MySQL5.1中默认,不支持事务和行级锁;
2.提供大量特性如全文索引、空间函数、压缩、延迟更新等;
3.数据库故障后,安全恢复性差;
4.对于只读数据可以忍受故障恢复,MyISAM依然非常适用;
5.日志服务器的场景也比较适用,只需插入和数据读取操作;
6.不支持单表一个文件,会将所有的数据和索引内容分别存在两个文件中;
7.MyISAM对整张表加锁而不是对行,所以不适用写操作比较多的场景;
8.支持索引缓存不支持数据缓存。
Memory引擎:
1.将数据在内存中缓存,不消耗IO;
2.存储数据速度较快但不会被保留,一般作为临时表的存储被使用。
存储引擎选取参考因素
1.是否有事务需求
如果需要事务支持最好选择InnoDB,如果主要是select和insert操作MyISAM比较合适,一般使用日志型的应用。
2.备份操作需求
如果能够关闭服务器进行备份,那么该因素可以忽略,如果需要在线进行热备份,则InnoDB引擎是一个不错的选择。
3.故障恢复需求
在对恢复要求比较好的场景中推荐使用InnoDB,因为MyISAM数据损坏概率比较大而且恢复速度比较慢。
4.性能上的需求
有些业务需求只有某些特定的存储引擎才能够满足,如地理空间索引也只有MyISAM引擎支持。所以在应用架构需求环境中也需要管理员折衷考虑,当然从各方面比较而言,InnoDB引擎还是默认应该被推荐使用的。
SQL分类
- DDL数据定义语言,用来维护存储数据的结构
代表指令:create、drop、alter
- DML数据操纵语言,用来对数据的操作
代表指令:insert、delete、update
DML单独分开一个DQL,代表数据查询语言,代表指令:select
- DCL数据控制语言,主要负责权限管理和事务
代表指令:grant、revoke、commit