目录
什么是数据库
存储数据用文件就可以了,为什么还要弄个数据库?
文件保存数据有以下几个缺点:
- 文件的安全性问题
- 文件不利于数据查询和管理
- 文件不利于存储海量数据
- 文件在程序中控制不方便
数据库存储介质:
- 磁盘
- 内存
为了解决上述问题,专家们设计出更加利于管理数据的东西——数据库,它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。
主流数据库
- SQL Server:微软的产品,.Net程序员的最爱,适合中大型项目。
- MySQL:甲骨文产品,世界上最受欢迎的数据库,并发性好,但不适合做复杂的业务。主要用在电商、SNS、论坛,对简单的SQL处理效果好。
- Oracle:甲骨文产品,适合大型项目和复杂的业务逻辑,但并发一般来说不如MySQL。
- PostgreSql:加州大学伯利克分校计算机系开发的关系型数据库,无论私用,商用,还是学术研究,都可以免费使用、修改和分发。
- SQLite:一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了。
- H2:是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
基本使用
连接服务器
连接MySQL服务器的方式如下:
ubuntu环境(auth_socket模式没有密码)
mysql -u root --protocol=SOCKET
# 或
sudo mysql
# 或显式指定 socket
mysql -u root --socket=/var/run/mysqld/mysqld.sock
centos7
mysql -h 127.0.0.1 -P 3306 -u root -p
解释说明:
- -h: 表示你要连接的MySQL服务器所在的主机,127.0.0.1表示本主机。
- -P: 表示你要连接的MySQL服务器所对应的端口号,一般默认是3306。
- -u: 表示用哪一个用户连接MySQL服务器,root表示超级用户。
- -p: 表示该用户对应的密码,密码可以直接跟在-p后面,也可以回车后输入。
连接成功,如下显示

服务器管理
停止服务器
通过systemctl stop mysql命令或service mysqld stop命令可以停止MySQL服务器。比如:

启动服务器
通过systemctl start mysql命令或service mysqld start命令可以启动MySQL服务器。比如:

重启服务器
通过systemctl restart mysql命令或service mysqld restart命令可以重启MySQL服务器。比如:

数据库服务器,数据库,表关系
- 所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
- 为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
数据库服务器、数据库和表的关系如下:

说明一下:
- 图中的Client对应的就是mysql命令,MySQL对应的就是mysql服务。
- DB(database)表示的是mysql管理的多个数据库,而每一个DB下会包含多张表。
使用案例
创建数据库
连接MySQL服务器后,通过create语句创建一个名为hellworld的数据库。比如:

这时/var/lib/mysql目录下,就会多出一个名为hellworld的目录。如下:

8.0前hellworld目录下只有一个名为的db.opt的文件,该文件中指明了当前数据库的默认字符编码和字符校验规则。
从 8.0 起,MySQL 把元数据迁到事务型数据字典里,不再使用文件型元数据,因此:
-
db.opt已被移除(旧版本用来记录库的默认字符集/排序规则)。在 8.0 里即使你ALTER DATABASE ... DEFAULT CHARACTER SET ...,目录中也不必再生成db.opt。MySQL开发者专区 -
.frm也被移除(表结构信息进了数据字典/写入.ibd的 SDI 里),所以你只看到student.ibd是正常的。MySQL开发者专区+2MySQL开发者专区+2
使用数据库
使用数据库之前,可以先通过show语句查看当前都有哪些数据库,然后再通过use语句使用指定的数据库。(hellworld库已删除,新建了helloworld库)比如:

使用数据库可以理解成,就是使用cd命令进入到该数据库对应的目录当中。
创建数据库表
这里我们通过create语句创建一个简单的student表。比如:

通过show语句可以查看创建的student表结构。比如:

由于student表采用的存储引擎是InnoDB,因此在MySQL的数据存储路径下的helloworld目录下,就会多出一个文件student.ibd。如下:

student.ibd是表数据和索引的文件。
如果说创建数据库的本质是在数据存储路径下新建一个目录的话,那么创建表本质实际就是在特定的数据库目录下新建若干个文件(InnoDB存储引擎对应的是两个,MyISAM存储引擎对应的是三个),因此在创建表之前一定要先选择一个数据库。
表中插入数据
通过DESC helloworld.student(或选中helloworld库后,desc student)语句可以查看对应的表结构。比如
通过insert语句可以向表中插入数据。比如:

查询表中的数据
通过select语句可以查看表中的数据。比如:

数据逻辑存储
表中的数据是以二维表格的形式进行呈现的,包括行和列。如下:
其中每一行我们称之为是一条记录,而每一列都代表一个属性(属性列)。
MySQL架构
MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、 Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体 系结构的一致性。
MySQL的架构设计如下:

MySQL架构主要可分为如下四层:
- 连接层:主要完成一些类似连接处理,授权认证及相关的安全方案。
- 服务层:在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断、SQL接口、SQL解析、SQL分析优化、缓存查询的处理以及部分内置函数执行等。各个存储引擎提供的功能都集中在这一层,如存储过程、触发器、试图等。
- 引擎层:由多种可拔插的存储引擎共同组成,真正负责MySQL中数据的存储和提取,每个存储引擎都有自己的优点和缺陷,服务层是通过存储引擎API来与它们交互的。
- 存储层:将数据存储在裸设备的文件系统之上,完成存储引擎的交互。
MySQL客户端
MySQL服务器会收到MySQL客户端发来的SQL语句,并根据SQL语句执行对应的操作。
- 这里的MySQL客户端不仅仅指的是连接MySQL时使用的mysql命令,MySQL客户端还包括语言接口客户端。
- MySQL给各种语言提供的用于访问数据库的接口,用户通过调用这些接口也可以向MySQL服务器发送SQL语句。
mysql命令本质是一个可执行程序,通过file命令可以看到该可执行程序是采用动态链接的方式生成的,通过ldd命令可以看到该可执行程序依赖的C/C++库文件。如下:

也就是说,mysql命令本身就是C/C++编写的,因此在编写mysql程序时,一定需要调用MySQL提供给C/C++的语言接口客户端。当然,MySQL不仅仅提供了C/C++对应的语言接口,像Python、Java、PHP等都有对应的MySQL接口。
SQL分类
SQL(Structured Query Language,结构化查询语言)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL语句可分为如下三类:
- DDL(Data Definition Language)数据定义语言,用来维护存储数据的结构。比如create语句、drop语句、alter语句等。
- DML(Data Manipulation Language)数据操作语言,用来对数据进行操作。比如insert语句、delete语句、update语句等。
- DCL(Data Control Language)数据控制语言,主要负责权限管理和事务。比如grant语句、revoke语句、commit语句。
说明一下: DML中又单独分了一个DQL(Data Query Language)数据查询语言,比如select语句、from语句、where语句等。
存储引擎
存储引擎就是数据库管理系统如何存储数据、如何为存储的数据建立索引、如何更新数据、如何查询数据等技术的实现方法,MySQL中的存储引擎是插件式的存储引擎,它可以支持多种存储引擎。
查看存储引擎
通过show语句可以查看MySQL支持的存储引擎。比如:

其中MySQL底层默认使用的存储引擎是InnoDB,该存储引擎支持事务、行级锁、外键等。
| Feature | MyISAM | BDB | Memory | InnoDB | Archive | NDB |
|---|---|---|---|---|---|---|
| Storage Limits | No | No | Yes | 64TB | No | Yes |
| Transactions(commit,rollback,etc.) | √ | √ | ||||
| Locking granularity | Table | Page | Table | Row | Row | Row |
| MVCC/Snapshot Read | √ | √ | √ | |||
| Geospatial support | √ | |||||
| B-Tree indexes | √ | √ | √ | √ | √ | |
| Hash indexes | √ | √ | √ | |||
| Full text search index | √ | |||||
| Clustered index | √ | |||||
| Data Caches | √ | √ | √ | |||
| Index Caches | √ | √ | √ | √ | ||
| Compressed data | √ | √ | ||||
| Encrypted data(via function) | √ | √ | √ | √ | √ | √ |
| Storage cost(space used) | Low | Low | N/A | High | Very Low | Low |
| Memory cost | Low | Low | Medium | High | Low | High |
| Bulk Insert Speed | High | High | High | Low | Very High | High |
| Cluster database support | √ | |||||
| Replication support | √ | √ | √ | √ | √ | √ |
| Foreign key support | √ | |||||
| Backup/Point-in-time recovery | √ | √ | √ | √ | √ | √ |
| Query cache support | √ | √ | √ | √ | √ | √ |
| Update Statistics for Data Dictionary | √ | √ | √ | √ | √ | √ |
InnoDB存储引擎是支持事务的,而MyISAM存储引擎是不支持的。
即InnoDB 支持“事务”(Transaction),可以把一组 SQL 当成一个原子操作,要么全部成功,要么全部回滚;MyISAM 不支持事务,每条语句都单独生效,出错了也不能把已执行的操作撤回

2744

被折叠的 条评论
为什么被折叠?



