mysql 基础篇(理解 mysql)

目录

[mysql 登录](#mysql 登录)

[mysql 退出](#mysql 退出)

[理解 mysql](#理解 mysql)

[什么是 mysql](#什么是 mysql)

mysql客户端

mysqld服务

[mysql 数据管理](#mysql 数据管理)

数据库

SQL分类

[DDl(data definition language)](#DDl(data definition language))

[DML(data manipulation language)](#DML(data manipulation language))

[DCL(data control language)](#DCL(data control language))

数据库架构

数据库存储引擎


mysql 登录

sql 复制代码
mysql -h 主机ip -P 端口号 -u 用户 -p 密码
  • 但是我们的 mysql 设置了免密登录,所以不需要输入密码

  • 如果我们不带 -h 就代表本地登录

  • 不带 -P 表示使用默认端口号

  • 一般我们使用时,只需要指明用户就可以

bash 复制代码
[root@slave0 /]# mysql -u root

mysql 退出

sql 复制代码
mysql> quit
Bye

mysql 退出直接输入 quit 就可以。

在我们学习任何的 mysql 的前提,我们当然需要学习 mysql 的登录与退出。

理解 mysql

前面我们说了mysql 的安装,但是我们目前还不知道 mysql 具体是一个什么东西,我们同时也不知道 mysql 是用来干什么的。

什么是 mysql

  • mysql 就是一个基于 CS 模型的网络数据存储服务。

上面是对 mysql 的概括,那么我们详细谈论一下 mysql.

mysql 实际上就是一个 客户端服务器的一个网络服务,这个服务就是为了帮助存储和管理数据,而我们的 mysql 就是客户端,mysqld 就是一个服务,mysql 服务和客户端也可以在一台机器上,同时 mysql 的服务和客户端也可以分离,一个服务可以为多个客户端提供服务。

mysql客户端

我们说的mysql 客户端实际上就是我们安装的命令行操作,但是我们的客户端可不只是我们自己安装的mysql,我们的客户端也可以是图形化界面,还可以是我们自己用语言写的带有逻辑的一些语言来控制mysql 服务,让其帮助我们存储和管理数据。

而我们可以看一下我们安装的 mysql(客户端)

bash 复制代码
[root@slave0 /]# which mysql
/usr/bin/mysql

上面就是 mysql 客户端,而服务一般后面带一个 d 表示守护进程,而服务一般都是以守护进程的方式来运行。

mysqld服务

bash 复制代码
[root@slave0 /]# which mysqld
/usr/sbin/mysqld

这个就是 mysql 的服务。

存储数据就是服务器帮我们存储数据。

mysql 数据管理

既然 mysql 是进行数据存储的,那么我们的文件也可以存储数据,我们为什么不直接用文件存储数据呢?

  • 用文件存储数据,我们并不知道文件里面的数据具体存储了什么

  • 文件存储数据,我们不好对文件里面的数据进行管理

  • 所谓的管理就是进程查找,删除,或者增加和修改

  • 文件存储数据我们也需要经常对文件进行 open 和 close 所以不方便

而 mysql,是一种表的关系型数据库,可以对数据有很好的管理效果,也方便存储。

数据库

在 mysql 里面是需要有数据库的,而数据库就是我们自己创建的,数据库里面又可以有多张表,表里面存储的就是我们的数据。

我们先看一下在 linux 下,数据库究竟是什么?

在mysql 的配置文件下(/etc/my.cnf) 里面有我们的默认数据存储的位置。

bash 复制代码
[root@slave0 /]# cat /etc/my.cnf | grep datadir
datadir=/var/lib/mysql

datadir 就是默认的数据存储的位置,下面我们用 mysql 客户端来创建一个数据库。

下面会设计一些部分的sql语句,这里会简单介绍一下,后面都会详细介绍。

sql 复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
复制代码
show databases; 是一个查看当前的数据库的一个 sql 语句,在命令行里面的 sql 一般我们都需要带分号,上面查询到的数据库都是我们默认的数据库,所以我们可以创建一个自己的数据库。

查看 /var/lib/mysql 目录下

bash 复制代码
-rw-r-----. 1 mysql mysql       56 8月  20 13:11 auto.cnf
-rw-------. 1 mysql mysql     1676 8月  20 13:11 ca-key.pem
-rw-r--r--. 1 mysql mysql     1112 8月  20 13:11 ca.pem
-rw-r--r--. 1 mysql mysql     1112 8月  20 13:11 client-cert.pem
-rw-------. 1 mysql mysql     1676 8月  20 13:11 client-key.pem
-rw-r-----. 1 mysql mysql      288 8月  20 14:19 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 8月  20 14:19 ibdata1
-rw-r-----. 1 mysql mysql 50331648 8月  20 14:19 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 8月  20 13:11 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 8月  20 14:19 ibtmp1
drwxr-x---. 2 mysql mysql     4096 8月  20 13:11 mysql
srwxrwxrwx. 1 mysql mysql        0 8月  20 14:19 mysql.sock
-rw-------. 1 mysql mysql        5 8月  20 14:19 mysql.sock.lock
drwxr-x---. 2 mysql mysql     8192 8月  20 13:11 performance_schema
-rw-------. 1 mysql mysql     1680 8月  20 13:11 private_key.pem
-rw-r--r--. 1 mysql mysql      452 8月  20 13:11 public_key.pem
-rw-r--r--. 1 mysql mysql     1112 8月  20 13:11 server-cert.pem
-rw-------. 1 mysql mysql     1676 8月  20 13:11 server-key.pem
drwxr-x---. 2 mysql mysql     8192 8月  20 13:11 sys

创建数据库

sql 复制代码
mysql> create database HelloMySql;
Query OK, 1 row affected (0.00 sec)
复制代码
创建数据库的语法就是:create database database_name;

我们创建一个 HelloMySql 的数据库,然后我们继续查看 /vat/lib/mysql 目录下有什么变化。

bash 复制代码
[root@slave0 mysql]# ll
总用量 122952
-rw-r-----. 1 mysql mysql       56 8月  20 13:11 auto.cnf
-rw-------. 1 mysql mysql     1676 8月  20 13:11 ca-key.pem
-rw-r--r--. 1 mysql mysql     1112 8月  20 13:11 ca.pem
-rw-r--r--. 1 mysql mysql     1112 8月  20 13:11 client-cert.pem
-rw-------. 1 mysql mysql     1676 8月  20 13:11 client-key.pem
drwxr-x---. 2 mysql mysql       20 8月  20 17:07 HelloMySql
-rw-r-----. 1 mysql mysql      288 8月  20 14:19 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 8月  20 14:19 ibdata1
-rw-r-----. 1 mysql mysql 50331648 8月  20 14:19 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 8月  20 13:11 ib_logfile1
-rw-r-----. 1 mysql mysql 12582912 8月  20 14:19 ibtmp1
drwxr-x---. 2 mysql mysql     4096 8月  20 13:11 mysql
srwxrwxrwx. 1 mysql mysql        0 8月  20 14:19 mysql.sock
-rw-------. 1 mysql mysql        5 8月  20 14:19 mysql.sock.lock
drwxr-x---. 2 mysql mysql     8192 8月  20 13:11 performance_schema
-rw-------. 1 mysql mysql     1680 8月  20 13:11 private_key.pem
-rw-r--r--. 1 mysql mysql      452 8月  20 13:11 public_key.pem
-rw-r--r--. 1 mysql mysql     1112 8月  20 13:11 server-cert.pem
-rw-------. 1 mysql mysql     1676 8月  20 13:11 server-key.pem
drwxr-x---. 2 mysql mysql     8192 8月  20 13:11 sys

该目录下多出来了一个 HelloMySql 的目录,所以我们可以得出结论,在 linux 下,创建一个数据库本质上就是在特定的目录下创建一个目录。

下面我们看一下创建表。

上面我们看到创建一个数据库就是创建了一个目录,那么我们继续创建一个表我们看一下对应的目录里面会有什么变化。

先看一下当前的 HelloMySql 目录下内容。

bash 复制代码
[root@slave0 HelloMySql]# ll
总用量 4
-rw-r-----. 1 mysql mysql 61 8月  20 17:07 db.opt

当前该目录下只有一个默认的文件,那么我们创建一个表。

我们这里创建一个学生表,该表里面有三个字段,姓名,年龄,性别。

不过在创建表前面,我们需要在某一个数据库下创建,所以我们需要先选择数据库。

sql 复制代码
选择数据库语法:use database_name;

那么我们可以在该数据库下看一下有没有表,在对应的数据库下查看表。

sql 复制代码
查看特定数据库下表的语法:show tables;
sql 复制代码
mysql> show tables;
Empty set (0.00 sec)

当前我们的数据库里面并没有表所以我们就按刚才说的创建一个表。

创建表的语法比较稍微复杂一点,这里先看一下。

sql 复制代码
mysql> create table student(
    -> name varchar(12),
    -> age int,
    -> sex varchar(2))
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+----------------------+
| Tables_in_HelloMySql |
+----------------------+
| student              |
+----------------------+
1 row in set (0.00 sec)

上面就是创建表的语法

  • create 就是创建

  • table 表示表

  • student 表示表名

  • 后面带()

  • 括号里面就是该表里面拥有哪些字段

  • name 表示其中的一个字段,varchar 表示该字段的数据类型,每一个字段用逗号隔开,最后分号结尾。

创建好后我们继续查看/var/lib/mysql/HelloMySql 下的文件有哪些变化。

bash 复制代码
[root@slave0 HelloMySql]# ll
总用量 112
-rw-r-----. 1 mysql mysql    61 8月  20 17:07 db.opt
-rw-r-----. 1 mysql mysql  8616 8月  20 17:16 student.frm
-rw-r-----. 1 mysql mysql 98304 8月  20 17:16 student.ibd

我们该目录下增加了两个文件,我们一看名字就知道和我们刚才创建表是由关系的。

所以在对应的数据库里面创建表的本质就是在特定的数据库目录里面创建一个文件。

SQL分类

经过刚才的查看表和数据库,我们也了解了一点点的 SQL 语句,其实 SQL 是有分类的,所以我们看一下 SQL 的分类。

DDl(data definition language)

ddl 就是数据库定义语言,常见的有:

  • create

  • drop

  • alter

DML(data manipulation language)

dml 就是对数据库中的数据进行操作的语言,常见的数据操作的有

  • insert

  • delete

  • update

DCL(data control language)

dcl 数据控制语言,数据控制语言就是对数据库的访问权限和安全性。它包括了授权、撤销权限、管理用户...等一些操作。

常见的数据控制语言有:

  • grant

  • revoke

  • ....

上面的 SQL 其实一般都是用大写比较合适,但是我们为了方便辨认,我们采用小写。

数据库架构

mysql 的数据库架构分为好几层,我们下面简单的了解一下即可。

  1. 客户端(Client):客户端是用户与MySQL数据库进行交互的接口。用户通过客户端发送SQL语句给数据库,并接收来自数据库的结果。

  2. 连接器(Connection Manager):连接器负责管理客户端与MySQL数据库之间的连接。它处理客户端的连接请求,验证客户端身份,建立连接,并将连接分配给相应的线程处理请求。

  3. 查询缓存(Query Cache):查询缓存是MySQL数据库提供的一个可选组件,用于缓存查询结果。当有相同的查询再次执行时,MySQL可以直接返回缓存中的结果,提高查询性能。

  4. 解析器(Parser):解析器负责解析客户端发送的SQL语句,将其转化为语法树和内部数据结构。解析器检查SQL语句的语法和语义正确性,并生成查询执行计划。

  5. 查询优化器(Query Optimizer):查询优化器负责优化查询执行计划,确定如何高效地执行查询。它根据查询的成本估算和可行性规则,选择最优的执行路径,以提高查询性能。

  6. 存储引擎(Storage Engine):存储引擎是MySQL数据库的核心组件,负责实际存储数据和处理数据的操作。MySQL支持多种存储引擎,如InnoDB、MyISAM等,每个存储引擎具有不同的特点和优势。

  7. 日志模块(Log Module):MySQL数据库有多种日志模块,用于记录数据库操作和事务变更日志。常见的日志包括二进制日志(Binary Log)、错误日志(Error Log)和事务日志(Transaction Log)等。

  8. 缓存和缓冲管理(Buffer Management):MySQL使用不同的缓存和缓冲区管理技术来提高数据读写性能。常见的缓存包括数据缓存(Buffer Pool)和索引缓存(Key Cache)等。

数据库存储引擎

查看存储引擎语句

sql 复制代码
show engines;
上面这个是一种方法,但是这样查看有点乱,所以我们可以用下面的带 \G
show engines \G;
mysql> show engines \G
*************************** 1. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
9 rows in set (0.00 sec)

上面的这些就是 mysql 里面的存储引擎,虽然上面这么多但是实际上我们常用的只有两个

  • innodb

  • myisam

想了解具体的mysql 的存储引擎可以自己去了解一下,这里不多说了。

相关推荐
xvch1 小时前
Kotlin 2.1.0 入门教程(二十五)类型擦除
android·kotlin
simplepeng10 小时前
我的天,我真是和androidx的字体加载杠上了
android
小猫猫猫◍˃ᵕ˂◍11 小时前
备忘录模式:快速恢复原始数据
android·java·备忘录模式
CYRUS_STUDIO13 小时前
使用 AndroidNativeEmu 调用 JNI 函数
android·逆向·汇编语言
梦否13 小时前
【Android】类加载器&热修复-随记
android
徒步青云14 小时前
Java内存模型
android
今阳14 小时前
鸿蒙开发笔记-6-装饰器之@Require装饰器,@Reusable装饰器
android·app·harmonyos
大地爱14 小时前
在Ubuntu 22.04 LTS 上安装 MySQL两种方式:在线方式和离线方式
mysql·ubuntu·adb
-优势在我19 小时前
Android TabLayout 实现随意控制item之间的间距
android·java·ui
hedalei19 小时前
android13修改系统Launcher不跟随重力感应旋转
android·launcher