【MySQL】MySQL基础

目录

什么是数据库

主流数据库

基本使用

连接和退出

创建数据库

使用数据库

创建数据库表

表中插入数据

查询表中的数据

mysql的架构

SQL 语句分类 

存储引擎


什么是数据库

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

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

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

[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) 模式的一种网络服务。

[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开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。

基本使用

连接和退出

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 的超级管理员账户
-ppassword(密码,小写 p)后不跟具体密码,执行后会提示你交互式输入(更安全,避免密码暴露在命令行历史中),-p 后直接跟密码(如 -p123456)也是允许的,但不安全,因为密码会明文留在命令历史中。

注意:

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

mysql -u root -p

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

[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 指令要用 ; 作为结尾)

show databases;

结果:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

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

[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 就是数据库的存储目录,我们查看这个目录下的文件:

[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 ,输入:

create database helloworld;
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:

[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 这一目录:

[root@VM-16-12-centos mysql]# ls /var/lib/mysql/helloworld
db.opt

使用数据库

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

use helloworld;

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

创建数据库表

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

create table student(
id int,
name varchar(32),
gender varchar(2)
);

查看 /var/lib/mysql/helloworld:

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

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

表中插入数据

在 mysql 命令行输入:

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

查询表中的数据

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的核心就是插件式存储引擎,支持多种存储引擎。

查看存储引擎

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)

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 压缩存储
操作只支持 INSERT 和 SELECT,不支持 UPDATE/DELETE
索引只支持自增主键索引
锁粒度行级锁

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

其他引擎(了解即可)

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

对比总结(面试重点)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值