【Mysql】数据库基础

一:前置登录

在登录的时候我们可能会遇到这样的一个问题

这个报错本质上是 : MySQL 的 root 用户不允许用密码从本地 TCP(127.0.0.1)登录,或者是 root 的认证方式不是 mysql_native_password,导致你输入密码也没用。

遇到的情况非常典型:

Ubuntu/Debian 系的 MySQL/MariaDB 默认把 root 设置成 auth_socket(用系统 root 身份登录,不用密码)。

理解:

你现在是"门口刷卡系统",但 root 的开门方式被设置成"刷脸"。你拿卡刷半天,系统当然说:不认识。

解决方法:

用系统 root 进入 MySQL 并修改 root 的登录方式

在进入mysql后面执行一下代码:

  1. 查看 root 的登录方式
cpp 复制代码
SELECT user, host, plugin FROM mysql.user;
  1. 改成密码登录方式

把认证方式改为 mysql_native_password:

cpp 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的新密码';
FLUSH PRIVILEGES;

注意:=='你的新密码'==改成你的密码

二:连接数据库

  1. 核心参数逻辑

连接一个网络服务,本质上需要知道 "去哪里找 " 和 "我是谁 ":

1)去哪里找:

-h (Host):指明主机 IP(默认是 127.0.0.1 本地)。

-P (Port):指明端口号(默认是 3306)。

2)我是谁:

-u (User):登录身份(目前是 root)。

-p (Password):验证密码(注意:输入时不回显,和 Linux 登录一样)。

  1. 完整写法

mysql -h 127.0.0.1 -P 3306 -u root -p

  1. 简写习惯:因为我们是连本地且用默认端口,通常只输

mysql -u root -p

  1. 退出:输入 quit。

小结:连接数据库本质上是在连接一个 TCP 网络服务。如果在本地且未改端口,-h 和 -P 可以省略。记住密码输入是不回显的,这是为了安全。

三:什么是数据库

为什么要选择数据库?

我们在存储数据的时候,正常的思维因该是直接创建一个普通文件存储就行,为什么要这样操作呢?

既然数据库最终也是存为文件,为什么不直接用 Linux 的 fopen/fwrite 存个文本文件呢?

文件系统的局限性:它只提供基本的存储能力,不提供内容管理能力。

场景:给你一个 10 万行的日志,让你找 "120 开头的 IP 有多少个"。

痛苦点:如果用文件,程序员必须自己写代码去读文件、解析字符串、过滤、统计。如果需求变了(比如改成删掉这些 IP),代码得重写。

数据库的价值:它是一套数据存储的解决方案。

数据库的优点:你把需求(SQL)告诉数据库服务(mysqld),它帮你去遍历、筛选、统计,然后把结果给你

区分 mysql 与 mysqld

mysqld (Server 端):

带 d 的通常是 Daemon(守护进程)。

它才是真正的数据库服务,它是服务端。

它在后台一直运行,监听 3306 端口,负责数据的存取和管理。

mysql (Client 端):

它只是一个客户端工具(类似于你手机上的抖音 App)。

你敲的命令通过它发送给服务端。

以后不仅仅可以用这个 CLI 工具,还可以用 C++/Java 代码或 Navicat 图形界面充当客户端

本质关系:C/S 架构(Client / Server)。

四:数据库的本质

此次使用linux系统进行查看:

  1. 定位数据库目录

通常在 /var/lib/mysql(可以通过配置文件 my.cnf 中的 datadir 查看)。

切换为 root 用户进去看看,里面是一堆文件。

注意:
想要查看这些文件,需要你是root用户或者sudo ls /var/lib/mysql,普通用户是直接查看不聊得

  1. 创建数据库的本质

MySQL 端操作:执行 create database helloworld;

Linux 端现象 :在 /var/lib/mysql 下多了一个名为 helloworld 的 目录。

结论:建库 = 建目录。

  1. 创建表的本质

MySQL 端操作:use helloworld; 然后 create table student (...)。

Linux 端现象:进入 helloworld 目录,发现多了几个文件(如 .frm, .ibd 等)。

结论:建表 = 建文件。

数据存储逻辑

虽然本质是文件,但这些是二进制文件。

程序员通过 SQL 告诉 mysqld 插入数据(insert into...)。

mysqld 按照特定的格式(行列式结构)把数据写入这些二进制文件中。

注意:程序员不要直接去修改这些文件,那是 mysqld 的工作。

小结:数据库在 Linux 上的物理表现非常朴素:数据库就是目录,表就是目录里的文件。但这套文件系统不由用户直接维护,而是由 mysqld 守护进程代理维护。

五:常见数据库与 MySQL 地位

MySQL:互联网公司首选。开源、生态极其丰富、能抗住百万/千万级并发,也是我们学习的重点。

Oracle:银行、金融等不差钱的复杂业务首选,服务费昂贵,极其稳定。

SQL Server:微软系。

SQLite:轻量级、嵌入式(手机App里常用)。

NoSQL (非关系型):Redis(缓存)、MongoDB(文档型)。它们通常作为 MySQL 的补充,配合使用。

六:MySQL 的整体架构

MySQL 服务端并不只是一坨代码,它内部有清晰的分层:

  1. 连接层(Connection Layer):
  • 处理客户端的连接请求。

  • 鉴权:验证用户名密码,确认你有没有权限。

  1. 服务层(SQL Layer):
  • 大脑:接收 SQL 语句。

  • 分析:词法分析、语法分析(判断你的 SQL 写对没)。

  • 优化:决定怎么查最快(比如先过滤再排序)。

  1. 存储引擎层(Storage Engine Layer):
  • 打工人:真正干活的一层。

  • 插件式设计:这是 MySQL 的一大特色。你可以根据需要拔插不同的引擎。

  • 它负责具体与操作系统的文件系统打交道。

七:SQL 语言分类与存储引擎

SQL 的三种分类

SQL 语句成百上千,但宏观上就三类(可以用链表的代码实现来类比):

DDL (Data Definition Language) 数据定义语言

作用:搞结构的。建库、建表、修改表结构。

类比:写 C/C++ 时定义 struct Node 结构体,或者定义链表的头节点。

关键字:CREATE, DROP, ALTER。

DML (Data Manipulation Language) 数据操作语言:

作用:搞内容的。增删查改表里的数据。

类比:链表定义好后,进行头插、尾插、删除节点、修改节点值的操作。

关键字:INSERT, DELETE, UPDATE, SELECT。

DCL (Data Control Language) 数据控制语言

作用:搞权限和事务的。

关键字:GRANT (授权), REVOKE (收权), COMMIT (提交)。

存储引擎 (Storage Engines)

查看命令 :show engines;

核心引擎

InnoDB(默认):支持事务,支持行级锁,支持外键。适用于大部分互联网业务。

MyISAM:不支持事务,但在某些只读或大文本读取场景下速度快。

理解:引擎就像"插件"或"类对象",你需要什么特性,底层就实例化哪个对象来帮你管理文件。绝大多数情况用默认的 InnoDB 即可。

小结 架构理解要分层:上层管连接和安检,中层管翻译和指挥,下层(存储引擎)管搬砖。SQL 语句按功能分为定义结构(DDL)、操作数据(DML)和控制权限(DCL)。

总结

相关推荐
ttthe_MOon2 小时前
MySQL 基础:索引的定义与作用
数据库·mysql
李坤林2 小时前
Android 12 中 App 与 SurfaceFlinger(SF)的 Vsync 通信机制
android·surfaceflinger
高远-临客2 小时前
unity IL2CPP模式下中使用UMP插件打包后无法播放视频监控报错问题解决方案
android·unity·音视频
装不满的克莱因瓶2 小时前
Windows下安装Dart
android·flutter·dart·移动端
心动啊1212 小时前
简单学下chromaDB
开发语言·数据库·python
Yao_YongChao2 小时前
adb wifi连接Android手机
android·adb·智能手机·无线连接手机·wifi连接手机
妮妮喔妮3 小时前
redis热点key拆分和读多副本
数据库·redis·缓存
雪球不会消失了3 小时前
MySQL(开发篇)
数据库·mysql·oracle