【MySQL】MySQL基础

目录

什么是数据库

主流数据库

基本使用

连接和退出

创建数据库

使用数据库

创建数据库表

表中插入数据

查询表中的数据

mysql的架构

[SQL 语句分类](#SQL 语句分类)

存储引擎


什么是数据库

存储数据用文件就可以了,为什么还要弄个数据库? 因为文件保存数据有以下几个缺点:

  • 文件的安全性问题
  • 文件不利于数据的增删改查:一般文件确实提供了数据的存储和基本的读写功能,但对文件内容做增删改查,如果没有数据库,程序员要自己写代码做增删改查,不方便,有时候甚至不可能完成,而有了数据库,只需要告诉它需求,它自动完成
  • 文件不利于存储海量数据
  • 文件在程序中控制不方便

为了解决上述问题,专家们设计出更加利于管理数据的东西------数据库,它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。数据库一般指的是:在磁盘或内存中存储的特定结构组织的数据。

bash 复制代码
[root@VM-16-12-centos mysql]# which mysql
/usr/bin/mysql
[root@VM-16-12-centos mysql]# which mysqld
/usr/sbin/mysqld

上面的 mysql 是 mysql 的客户端,mysqld 是 mysql 的服务端。mysql 的本质是一种基于 C(mysql) S (mysqld) 模式的一种网络服务。

bash 复制代码
[root@VM-16-12-centos mysql]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address      Foreign Address         State       PID/Program name             
tcp6       0      0 :::3306            :::*                    LISTEN     22085/mysqld     

主流数据库

  • SQL Sever: 微软的产品,.Net程序员的最爱,中大型项目。
  • Oracle: 甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如MySQL。
  • MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好。
  • PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发。
  • SQLite: 是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
  • H2: 是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。

基本使用

连接和退出

bash 复制代码
mysql -h 127.0.0.1 -P 3306 -u root -p

参数解释:

参数 含义 在本命令中的值
-h 指明 host(主机地址) 127.0.0.1 ------ 本机回环地址,即连接本地的 MySQL 服务
-P 指明 port(端口号,大写 P) 3306 ------ MySQL 默认监听端口
-u 指明 user(用户名) root ------ MySQL 的超级管理员账户
-p password(密码,小写 p) 后不跟具体密码,执行后会提示你交互式输入(更安全,避免密码暴露在命令行历史中),-p 后直接跟密码(如 -p123456)也是允许的,但不安全,因为密码会明文留在命令历史中。

注意:

-h-P 如果省略,默认就是 127.0.0.13306,所以本命令等效于简写:

bash 复制代码
mysql -u root -p

链接成功后,在 mysql 的命令行输入 quit 即可退出

bash 复制代码
[root@VM-16-12-centos mysql]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> quit
Bye

创建数据库

链接数据库后,输入:(注意 mysql 指令要用 ; 作为结尾)

bash 复制代码
show databases;

结果:

bash 复制代码
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

退出 mysql 使用 vim 查看 /etc/my.cnf:

cpp 复制代码
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-grant-tables
character-set-server=utf8
default-storage-engine=innodb

这就是 mysql 的配置文件,其中:datadir=/var/lib/mysql 就是数据库的存储目录,我们查看这个目录下的文件:

cpp 复制代码
[root@VM-16-12-centos mysql]# ls /var/lib/mysql
auto.cnf    client-cert.pem  ibdata1      ibtmp1      mysql.sock.lock     public_key.pem   sys
ca-key.pem  client-key.pem   ib_logfile0  mysql       performance_schema  server-cert.pem
ca.pem      ib_buffer_pool   ib_logfile1  mysql.sock  private_key.pem     server-key.pem

我们发现 mysql 现在的数据库其实就是 /var/lib/mysql 的子目录。

我们再链接上 mysql ,输入:

bash 复制代码
create database helloworld;
bash 复制代码
mysql> create database helloworld;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| helloworld         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

再退出 mysql 查看 /var/lib/mysql:

bash 复制代码
[root@VM-16-12-centos mysql]# ls /var/lib/mysql
auto.cnf    client-cert.pem  ib_buffer_pool  ib_logfile1  mysql.sock          private_key.pem  server-key.pem
ca-key.pem  client-key.pem   ibdata1         ibtmp1       mysql.sock.lock     public_key.pem   sys
ca.pem      helloworld       ib_logfile0     mysql        performance_schema  server-cert.pem

发现多了 helloworld 这一目录,说明创建数据库的本质就是创建 Linux 文件目录,我们查看helloworld 这一目录:

bash 复制代码
[root@VM-16-12-centos mysql]# ls /var/lib/mysql/helloworld
db.opt

使用数据库

链接上 mysql 后,上面输入 show databases; 后,展示了 information_schema、mysql、performance_schema、sys,和我们自己创建的 helloworld 等等数据库,输入:

bash 复制代码
use helloworld;

可以对开始特定的数据库进行操作。

创建数据库表

上面选择 helloworld 这个数据库后,输入:

bash 复制代码
create table student(
id int,
name varchar(32),
gender varchar(2)
);

查看 /var/lib/mysql/helloworld:

bash 复制代码
[root@VM-16-12-centos mysql]# ls /var/lib/mysql/helloworld
db.opt  student.frm  student.ibd

与上面相比,多了 student.frm student.ibd 这两个文件,说明创建数据库表本质就是创建 Linux 目录下的文件

表中插入数据

在 mysql 命令行输入:

bash 复制代码
insert into student (id, name, gender) values (1, '张三', '男');
insert into student (id, name, gender) values (2, '李四', '女');
insert into student (id, name, gender) values (3, '王五', '男');

查询表中的数据

bash 复制代码
select * from student;

mysql的架构

逻辑架构(四层结构)

MySQL 采用客户端/服务器模式,从你输入命令到返回结果,经历了下面这几层:

SQL 语句分类

  • DDL【data definition language】 数据定义语言,用来维护存储数据的结构

代表指令: create, drop, alter

  • DML【data manipulation language】 数据操纵语言,用来对数据进行操作

代表指令: insert,delete,update

DML中又单独分了一个DQL,数据查询语言,代表指令: select

  • DCL【Data Control Language】 数据控制语言,主要负责权限管理和事务

代表指令: grant,revoke,commit

存储引擎

存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。MySQL的核心就是插件式存储引擎,支持多种存储引擎。

查看存储引擎

bash 复制代码
show engines \G
bash 复制代码
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)

InnoDB(默认引擎,MySQL 5.5+)

绝对的主流,99%的业务场景都用它。

特性 说明
事务 完整支持 ACID,有 COMMITROLLBACK、崩溃恢复
锁粒度 行级锁(Row-Level Lock),高并发下性能好
外键 支持外键约束,保证数据一致性
索引 使用 B+ 树,数据和索引存储在一起(聚簇索引)
MVCC 多版本并发控制,实现非阻塞读,提高并发性能
物理文件 .ibd 文件(数据和索引)、ib_logfile(重做日志)

适用场景:几乎一切事务型业务------电商订单、用户账户、支付系统、内容管理系统。

MyISAM(MySQL 5.5 之前的默认引擎)

老牌引擎,现在已边缘化,但仍有很多历史遗留系统在用。

特性 说明
事务 ❌ 不支持
锁粒度 表级锁(Table-Level Lock),写操作会锁整张表
外键 ❌ 不支持
索引 使用 B+ 树,但数据和索引分开存储(非聚簇索引)
压缩 支持表压缩,可大幅节省空间
物理文件 .frm(表结构)、.MYD(数据)、.MYI(索引)

优点 :读操作极快,占用空间小。

缺点:写操作锁表,并发差;崩溃后难以恢复。

适用场景:纯只读报表、数据仓库、日志分析(几乎不写入的场景)。

Memory(内存引擎)

数据全部存在内存中,重启即丢失。

特性 说明
存储位置 内存(RAM),读写极快
持久化 ❌ 不持久,服务重启数据全丢
锁粒度 表级锁
索引 默认使用 Hash 索引(也支持 B 树)
适用数据量 小数据量(受 max_heap_table_size 限制)

适用场景:临时表、缓存表、会话数据、高频查询的字典表(如省市区编码)。

Archive(归档引擎)

特性 说明
压缩比 极高,以 zlib 压缩存储
操作 只支持 INSERTSELECT,不支持 UPDATE/DELETE
索引 只支持自增主键索引
锁粒度 行级锁

适用场景:日志归档、审计记录、历史数据冷存储。

其他引擎(了解即可)

引擎 特点 场景
CSV 数据存为 CSV 文件 与 Excel/外部系统交换数据
Blackhole 写入的数据直接丢弃(黑洞) 用于主从复制中的中继,或性能测试
Federated 访问远程 MySQL 表,不存本地数据 数据联邦查询(现较少用)

对比总结(面试重点)

对比维度 InnoDB MyISAM Memory
事务
行级锁 ❌(表锁) ❌(表锁)
外键
崩溃恢复 ✅(通过 Redo Log)
MVCC
数据与索引存储 聚簇(在一起) 非聚簇(分开) 非聚簇
全文索引 ✅(5.6+支持)
空间占用 较大 较小 极小(内存)
适用场景 事务型OLTP 只读报表 临时缓存