MySQL从入门到入土 -- 2.数据库基础

0 阅读9分钟

2 数据库基础

2.1 什么是数据库

  • 本质上,数据库就是一个文件,而且不仅仅是一个普通的文件,他有自己规范的增删查改方式,逻辑,以实现更方便的增删查改,同时,区别于excel,数据库还为程序员提供了接口,这样程序员就可以实现全自动化地增删查改了

  • 放在网络中看,数据库同时还是一个C/S网络服务,也是方便厂商管理用户数据,比方说用户在自己的设备上做了某些操作,自动执行了某个指令,然后通过网络,服务器中的某个服务接收了这个指令,然后修改了企业服务器中数据库的某个内容

2.2 数据库的基础操作

  • 显示数据库列表(创建完的库会放进一个列表里,这个表称为database表)
mysql> show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
  • /var/lib/mysql表示数据库的默认存储目录,此时如果我们新开一个会话,切到该目录下
root@iZwz9b2bj2gor4d8h3rlx0Z:/var/lib/mysql# ll -al
total 91612
drwx------  7 mysql mysql     4096 Apr 20 19:17  ./
drwxr-xr-x 53 root  root      4096 Apr 20 18:41  ../
-rw-r-----  1 mysql mysql       56 Apr 20 18:41  auto.cnf
-rw-r-----  1 mysql mysql      180 Apr 20 18:41  binlog.000001
-rw-r-----  1 mysql mysql      404 Apr 20 18:41  binlog.000002
-rw-r-----  1 mysql mysql      614 Apr 21 19:06  binlog.000003
-rw-r-----  1 mysql mysql       48 Apr 20 18:41  binlog.index
-rw-------  1 mysql mysql     1705 Apr 20 18:41  ca-key.pem
-rw-r--r--  1 mysql mysql     1112 Apr 20 18:41  ca.pem
-rw-r--r--  1 mysql mysql     1112 Apr 20 18:41  client-cert.pem
-rw-------  1 mysql mysql     1705 Apr 20 18:41  client-key.pem
-rw-r--r--  1 root  root         0 Apr 20 18:41  debian-5.7.flag
-rw-r-----  1 mysql mysql   196608 Apr 21 19:08 '#ib_16384_0.dblwr'
-rw-r-----  1 mysql mysql  8585216 Apr 20 18:41 '#ib_16384_1.dblwr'
-rw-r-----  1 mysql mysql     3439 Apr 20 18:41  ib_buffer_pool
-rw-r-----  1 mysql mysql 12582912 Apr 21 19:06  ibdata1
-rw-r-----  1 mysql mysql 12582912 Apr 20 18:42  ibtmp1
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41 '#innodb_redo'/
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41 '#innodb_temp'/
-rw-r-----  1 mysql mysql        8 Apr 20 18:41  iZwz9b2bj2gor4d8h3rlx0Z.pid
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41  mysql/
-rw-r-----  1 mysql mysql 26214400 Apr 21 19:06  mysql.ibd
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41  performance_schema/
-rw-------  1 mysql mysql     1705 Apr 20 18:41  private_key.pem
-rw-r--r--  1 mysql mysql      452 Apr 20 18:41  public_key.pem
-rw-r--r--  1 mysql mysql     1112 Apr 20 18:41  server-cert.pem
-rw-------  1 mysql mysql     1705 Apr 20 18:41  server-key.pem
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41  sys/
-rw-r-----  1 mysql mysql 16777216 Apr 21 19:08  undo_001
-rw-r-----  1 mysql mysql 16777216 Apr 20 18:44  undo_002
  • 不难发现,database列表的一部分内容也在这个目录里,并且,这个数据库貌似就是一个目录而已

  • 是的,其实如果我们新建一个数据库,mysqld会帮我们自动新建一个目录,并且放一些基础的文件

  • 使用以下命令新建数据库

mysql> create database hello;
Query OK, 1 row affected (0.01 sec)
  • 此时再查看database列表和存储目录
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| hello              |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
root@iZwz9b2bj2gor4d8h3rlx0Z:/var/lib/mysql# ll -al
total 91616
drwx------  8 mysql mysql     4096 Apr 21 23:55  ./
drwxr-xr-x 53 root  root      4096 Apr 20 18:41  ../
-rw-r-----  1 mysql mysql       56 Apr 20 18:41  auto.cnf
-rw-r-----  1 mysql mysql      180 Apr 20 18:41  binlog.000001
-rw-r-----  1 mysql mysql      404 Apr 20 18:41  binlog.000002
-rw-r-----  1 mysql mysql      802 Apr 21 23:55  binlog.000003
-rw-r-----  1 mysql mysql       48 Apr 20 18:41  binlog.index
-rw-------  1 mysql mysql     1705 Apr 20 18:41  ca-key.pem
-rw-r--r--  1 mysql mysql     1112 Apr 20 18:41  ca.pem
-rw-r--r--  1 mysql mysql     1112 Apr 20 18:41  client-cert.pem
-rw-------  1 mysql mysql     1705 Apr 20 18:41  client-key.pem
-rw-r--r--  1 root  root         0 Apr 20 18:41  debian-5.7.flag
drwxr-x---  2 mysql mysql     4096 Apr 21 23:55  hello/
-rw-r-----  1 mysql mysql   196608 Apr 21 23:55 '#ib_16384_0.dblwr'
-rw-r-----  1 mysql mysql  8585216 Apr 20 18:41 '#ib_16384_1.dblwr'
-rw-r-----  1 mysql mysql     3439 Apr 20 18:41  ib_buffer_pool
-rw-r-----  1 mysql mysql 12582912 Apr 21 23:55  ibdata1
-rw-r-----  1 mysql mysql 12582912 Apr 20 18:42  ibtmp1
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41 '#innodb_redo'/
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41 '#innodb_temp'/
-rw-r-----  1 mysql mysql        8 Apr 20 18:41  iZwz9b2bj2gor4d8h3rlx0Z.pid
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41  mysql/
-rw-r-----  1 mysql mysql 26214400 Apr 21 23:55  mysql.ibd
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41  performance_schema/
-rw-------  1 mysql mysql     1705 Apr 20 18:41  private_key.pem
-rw-r--r--  1 mysql mysql      452 Apr 20 18:41  public_key.pem
-rw-r--r--  1 mysql mysql     1112 Apr 20 18:41  server-cert.pem
-rw-------  1 mysql mysql     1705 Apr 20 18:41  server-key.pem
drwxr-x---  2 mysql mysql     4096 Apr 20 18:41  sys/
-rw-r-----  1 mysql mysql 16777216 Apr 21 19:08  undo_001
-rw-r-----  1 mysql mysql 16777216 Apr 21 23:55  undo_002
  • 你能发现这里多了个hello的目录

  • 使用数据库操作(和Excel操作类似,我们要使用页面上的某个或者某几个格子,需要先选中,这里就是选择上该数据库)

use hello;
  • 创建数据库表(注意,这里是创建表而不是创建数据库),有点相像是结构体的写法,其实吧,这本质上就是类似于excel中写一个表头
create table hero( name varchar(64), gender varchar(64) );

Pasted image 20260422000705.png

  • 数据库的插入操作
mysql> insert into hero (name, gender) values ('guzhangjiqiren', 'wuzhuangzhishengji');
Query OK, 1 row affected (0.01 sec)

mysql> insert into hero (name, gender) values ('chujun', 'cixiaogui');
Query OK, 1 row affected (0.00 sec)
  • 其实就类似于在excel中这样做

Pasted image 20260422000947.png

  • 数据库的查询操作(从student表中全部查询)
mysql> select * from hero;
+----------------+--------------------+
| name           | gender             |
+----------------+--------------------+
| guzhangjiqiren | wuzhuangzhishengji |
| chujun         | cixiaogui          |
+----------------+--------------------+
2 rows in set (0.00 sec)
  • 注意事项:
    1. 一条可执行语句的结尾的标志是;
    2. 和C语言类似,行的末尾不一定得有;,如果没打;输入了回车,mysql会等待你继续输入内容,直到你输入了;

2.4 服务器,数据库,表 之间的关系

image-1.png

  • 本质上,所谓数据库服务器的核心,即在于数据库的服务端,类似于mysqld,每个mysqld下可能维护了不止一个数据库(虽然绝大部分场景下,单个库就已经够用了),每个库也不仅仅只有一个表,我们在软件上的不同页面获取的数据,有可能来自于不同的表

2.5 mysql的架构

  • 这里我们主要谈论的是服务端的架构

MySQL架构图.png

2.5.1 client端
  • 在用户角度,访问数据库的途径主要有三种
    1. 通过命令行访问数据库: 即我们现在使用的Linux的mysql,就只能通过命令行式的访问
    2. 通过GUI界面访问数据库: 例如微软家的sql_server,就允许用户在图形化界面下访问
    3. 通过其他语言连接服务来访问数据库: 例如C++,C,python,都可以通过连接服务访问
2.5.2 服务端
  1. 连接池: 主要用于检测用户身份和权限,以及安全性检测等,还可以将用户信息维护到连接池中,方便用户下次访问
  2. 服务层: 主要进行词法语法分析,对语句进行优化和缓存等
  3. 存储引擎层: 有点类似于不同数据结构的思想,即对于不同的数据,选择一个合适的存储方式很重要,不同数据对于增删查改效率,存储空间大小等等有不同的需求,所以对于不同的数据,就可以选择不同的存储引擎,以不同方式访问文件系统层的数据
  4. 文件系统层: 就是操作系统的文件系统层,存储引擎会沟通文件系统层,来进行增删查改
  • 所以本质上,mysql就是在操作系统的文件系统上做文章,帮我们更好地管理数据
2.5.3 存储引擎
  • 存储引擎是支持热插拔的,即我可以选择不要某个引擎,临时更改某个库使用的存储引擎,像插拔U盘一样方便

  • 存储引擎有点类似于驱动程序,即类似于操作系统中的device_struct,也是被一个结构体维护起来

  • 不同的数据库程序对于存储引擎的支持可能不太一样,但常用的存储引擎其实就两个,即InnoDBMyISAM,一般都支持的

2.5.4 查看mysql支持的存储引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

2.6 SQL的分类

  1. DDL(Data Definition Languages): 数据定义语言,即对于表的大体框架的增删查改,这些语句一般会修改表的结构,同时也伴随着修改表的内容,类似于定义链表中的节点,或者说规定该表的表头,例如我们刚刚接触过的create,drop,alter
  2. DML(Data Manipulation Language): 数据操纵语句,即修改表的具体内容,这些语句一般无法直接更改表的结构,只能修改其内容,相对于DDL来说,DML能修改更为细致的内容,例如对于某行某列的针对性修改,类似于修改链表节点的具体的值,例如insert,delete,update,select(select语句包含在DQL(数据查询语言),DQL又属于DML)
  3. DCL(Data Control Language): 数据控制语句,用于控制数据的访问权限和访问级别,例如grant,revoke,commit