news 2026/6/23 20:39:57

4.1.17.1.MYSQL基础

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
4.1.17.1.MYSQL基础

1.查询语句的执行流程

第一步,客户端发送SQL查询语句到MySQL服务器
第二步,MySQL服务器的连接器开始处理这个请求,跟客户端建立连接、获取权限、管理连接
第三步(MySQL 8.0以后已经干掉了),连接建立后,MySQL服务器的查询缓存组件会检查是否有缓存的查询结果。如果有,直接返回给客户端;如果没有,进入下一步。
第三步,解析器开始对SQL语句进行解析,检查语句是否符合SQL语法规则,确保引用的数据库、表和列都存在,并处理SQL语句中的名称解析和权限验证
第四步,优化器负责确定SQL语句的执行计划,这包括选择使用哪些索引,以及决定表之间的连接顺序等。优化器会尝试找出最高效的方式来执行查询。
第五步,执行器会调用存储引擎的API来进行数据的读写。
第六步,MySQL的存储引擎是插件式的,不同的存储引擎在细节上面有很大不同。例如,InnoDB是支持事务的,而MyISAM是不支持的。之后,会将执行结果返回给客户端
第七步,客户端接收到查询结果,完成这次查询请求。

2.MYSQL移除查询缓存的原因

2.1.性能瓶颈明显

在现代高并发应用中,查询缓存反而成为性能瓶颈。

缓存的维护和失效操作会引起严重的锁竞争,尤其是在 InnoDB 存储引擎下。

2.2.使用率下降

很多用户根本不使用查询缓存,或者使用不当。

大部分性能优化依赖InnoDB Buffer Pool和应用层缓存(如RedisMemcached),而不是查询缓存。

2.3.替代方案更高效

InnoDB Buffer Pool 可以高效缓存热点数据和索引。

应用层缓存更灵活,可缓存查询结果或业务对象,避免数据库内部复杂锁竞争。

3.MYSQL常用命令

3.1.数据库操作

创建数据库:
CREATE DATABASE database_name;

删除数据库:
DROP DATABASE database_name;
选择数据库:
USE database_name;

3.2.表操作


①创建表:
CREATE TABLE table_name(
column1 datatype,
column2 datatype,
...
);
②删除表:
DROP TABLEtable_name;
③显示所有表:
SHOW TABLES;
④查看表结构:
DESCRIBEDESCtable_name;
⑤修改表(添加列):
ALTER TABLE table_name ADD column_name datatype;


3.3.CRUD 命令


①插入数据:
INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
②查询数据:
SELECT column_names FROM table_name WHERE condition;
③更新数据:
UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition;
④删除数据:
DELETE FROM table_name WHERE condition;


3.4.说说索引和约束的创建修改命令


①创建索引:
CREATE INDEXindex_nameONtable_name (column_name);
②添加主键约束:
ALTER TABLEtable_nameADD PRIMARY KEY (column_name);
③添加外键约束:
ALTER TABLEtable_nameADD CONSTRAINTfk_nameFOREIGN KEY(column_name) REFERENCES parent_table (parent_column_name);

3.5.用户和权限管理的命令

①创建用户:
CREATE USER'username'@'host'IDENTIFIED BY'password';
②授予权限:
GRANT ALL PRIVILEGES ON database_name.table_nameTO'username'@'host';
③撤销权限:
REVOKE ALL PRIVILEGES ONdatabase_name.table_nameFROM'username'@'host';
④删除用户:
DROP USER'username'@'host';

3.6.事务控制的命令

①开始事务:
START TRANSACTION;
②提交事务:
COMMIT;
③回滚事务:
ROLLBACK;

④关闭自动提交模式

SET autocommit = 0; --关闭自动提交

3.7.分组

①按指定列分组,并对每组数据执行聚合计算。

SELECTID,ADDTIME FROM YONGHU GROUP BY ID;

②统计每个用户的订单总金额。

SELECTuser_id,SUM(amount) AS total_amountFROMordersGROUP BYuser_id;

③按用户和订单状态组合维度统计记录数。

SELECTuser_id, status,COUNT(*) AS cntFROM ordersGROUP BY user_id, status;

④分组后过滤数据(HAVING)

SELECT user_id, SUM(amount) AS total FROM orders GROUP BY user_id HAVING total > 100;

HAVING是用于过滤分组后的数据,与WHERE不同,WHERE是用于过滤分组前的数据

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 18:51:11

【LeetCode刷题】跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。示例 1:输入&am…

作者头像 李华
网站建设 2026/6/22 21:24:26

鸿蒙PC UI控件库 - PasswordInput 密码输入框详解

视频地址: https://www.bilibili.com/video/BV1jomdBBE4H/ 📋 目录 概述特性快速开始API 参考使用示例主题配置最佳实践常见问题总结 概述 PasswordInput 是控件库中专用于密码输入的组件,基于 TextInput 扩展而来,支持显示/…

作者头像 李华
网站建设 2026/6/23 18:51:11

day37简单的神经网络@浙大疏锦行

day37简单的神经网络浙大疏锦行 使用 sklearn 的 load_digits 数据集 (8x8 像素的手写数字) 进行 MLP 训练。 import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_digits from sklearn.model_selection import train_test_s…

作者头像 李华
网站建设 2026/6/23 13:42:06

JAVA的平凡之路——此峰乃是最高峰JVM-附加小菜-04

图1.1每台机器300/s,每个订单对象假设1KB,300KB/s可能会涉及其他对象放大20倍,并且可能涉及其他操作情况,再放大10 300*20*10 大约每秒60MB/s 当前堆内存 3072 MB,新生代占1/3,大约 1g ,并且ede…

作者头像 李华
网站建设 2026/6/22 22:44:18

【电力系统】电力系统优化与控制热液调度附Matlab代码和报告

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 🍊个人信条:格物致知,完整Matlab代码获取及仿…

作者头像 李华