概述

mysql是非常常用的一个数据库,作为一名开发人员,基本都是用到过它的。对于我自己工作经历来说,最早除了在大学时期学习过有关sql的一些语句,后面实习作为一名PHP工程师对于数据库使用的是ORM,以至于那个时候基本忘记了如何写SQL语句,如今转型做java,虽然基本都是使用mybatis 作为持久层,但是很多业务场景需要自己去编写sql语句,甚至涉及到一些sql优化的内容,更重要的是对于sql优化来说更重要的是数据库的设计,设计的合理的数据库需要优化的地方并不多,抱着深入学习mysql的目的,便开始了sql的基础深入学习,便以此文开始记录学习笔记。

架构

Mysql逻辑架构图

和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可 以根据业务的需求和实际需要选择合适的存储引擎。

从MySQL的逻辑结构图中可以很容易看出,MySQL的架构总体分为四层:连接层、服务层、引擎层和储存层。

连接层

最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证 安全接入的客户端提供线程。同样在该层上可以实现基于 SSL 的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

服务层

服务和工具

系统管理和控制工具

SQL Interface

SQL 接口。接受用户的 SQL 命令,并且返回用户需要查询的结果。比如 select from 就是调用 SQL Interface

Parser

解析器。 SQL 命令传递到解析器的时候会被解析器验证和解析

Optimizer

查询优化器。SQL 语句在查询之前会使用查询优化器对查询进行优化,比如有 where 条件时,优化器来决定先投影还是先过滤。

Cache 和 Buffer

查询缓存。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key 缓存,权限缓存等

引擎层

存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。(show engines可以查看所有的数据库引擎)

Engine

Support

Comment

Transactions

XA

Savepoints

InnoDB

DEFAULT

Supports transactions, row-level locking, and foreign keys

YES

YES

YES

MRG_MYISAM

YES

Collection of identical MyISAM tables

NO

NO

NO

MEMORY

YES

Hash based, stored in memory, useful for temporary tables

NO

NO

NO

BLACKHOLE

YES

/dev/null storage engine (anything you write to it disappears)

NO

NO

NO

MyISAM

YES

MyISAM storage engine

NO

NO

NO

CSV

YES

CSV storage engine

NO

NO

NO

ARCHIVE

YES

Archive storage engine

NO

NO

NO

PERFORMANCE_SCHEMA

YES

Performance Schema

NO

NO

NO

FEDERATED

NO

Federated MySQL storage engine

我们可以看到,MySQL自带安装了许多引擎,默认的引擎就是InnoDB,常用的就是InnoDB和MyISAM

MyISAM和InnoDB比较

对比项

MyISAM

InnoDB

外键

不支持

支持

事务

不支持

支持

行表锁

表锁,即使操作一条记录也会锁住整个表, 不适合高并发的操作

行锁,操作时只锁某一行,不对其它行有影响, 适合高并发的操作

缓存

只缓存索引,不缓存真实数据

不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响

关注点

读性能

并发写、事务、资源

默认安装

Y

Y

默认使用

N

Y

自带系统表使用

Y

N

储存层

数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

执行流程

执行 show prifiles命令,可以查看最近的几次查询。

根据Query_ID,可以进一步执行 show profile cpu,block io for query Query_id 来查看sql的具体执行步骤。

查询流程

mysql客户端通过协议与mysql服务器建连接,发送查询语句

先检查查询缓存,如果命中,直接返回结果, 否则进行语句解析

也就是说,在解析查询之前,服务器会先访问查询缓存(query cache)——它存储 SELECT 语句以及相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅 仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。

语法解析器和预处理,首先mysql通过关键字将 SQL 语句进行解析,并生成一颗对应的“解析树”。mysql 解析器将使用 mysql 语法规则验证和解析查询;预处理器则根据一些 mysql 规则进一步检查解析数是否合法

查询优化器当解析树被认为是合法的了,并且由优化器将其转化成执行计划。一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。。

mysql 默认使用的BTREE 索引,并且一个大致方向是:无论怎么折腾 sql,至少在目前来说,mysql 最多只用到表中的一个索引,所以如果要用索引的话,尽可能用组合索引。

sql执行流程

命令的顺序

SELECT DISTINCT

< select list >

FROM

< left_table > < join_type >

JOIN ON

WHERE

< where condition >

GROUP BY

< group_by_list >

HAVING

ORDER BY

LIMIT

< limit number >

实际顺序

随着Mysql版本的更新换代,其优化器也在不断的升级,优化器会分析不同执行顺序产生的性能消耗不同而动态调整执行顺序。下面是经常出现的查询顺序:

1 FROM

2 ON

3 JOIN

4 WHERE

5 GROUP BY

6 HAVING

7 SELECT

8 DISTINCT

9 ORDER BY

10 LIMIT

SQL解析图

总结一下就是:from-where-groupby-having-select-orderby-limit

一些问题

字符集

SQL 语句

描述

备注

show databases

列出所有数据库

create database 库名

创建一个数据库

create database 库名 character set utf8

创建数据库,顺便执行字符集为 utf-8

show create database 库名

查看数据库的字符集

show variables like ‘%char%’

查询所有跟字符集相关的信息

set [字符集属性]=utf8

设置相应的属性为 utf8

只是临时修改,当前有效。服务重启后, 失效。

alter database 库名 character set 'utf8'

修改数据库的字符集

alter table 表名 convert to character set 'utf8'

修改表的字符集

修改配置文件指定字符集

[client]

default-character-set=utf8

[mysqld]

character_set_server=utf8

character_set_client=utf8

collation-server=utf8_general_ci

[mysql]

default-character-set=utf8

无论是修改 mysql 配置文件或是修改库、表字符集,都无法改变已经变成乱码的数据。只能删除数据重新插入或更新数据才可以完全解决

大小写敏感问题

windows 系统默认大小写不敏感,但是 linux 系统是大小写敏感的

查看大小写是否敏感:show variables like '%lower_case_table_names%'

设置大小写不敏感:在my.cnf这个配置文件[mysqld] 中加入lower_case_table_names = 1,然后重启服务器。

注意:如果要设置属性为大小写不敏感,要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则将 找不到数据库名。在进行数据库参数设置之前,需要掌握这个参数带来的影响,切不可盲目设置。

SQL MODE

sql_mode 定义了对 Mysql 中 sql 语句语法的校验规则!

sql_mode 是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。在生产环境必须将这个值设置为严格模式,所以开发、测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。

常用的值

作用

ONLY_FULL_GROUP_BY

对于 GROUP BY 聚合操作,如果在 SELECT 中的列,没有在 GROUP BY 中出现, 那么这个 SQL 是不合法的,因为列不在 GROUP BY 从句中

NO_AUTO_VALUE_ON_ZERO

该值影响自增长列的插入。默认设置下,插入 0 或 NULL 代表生成下一个自增长值。如果用户 希望插入的值为 0,而该列又是自增长的,那么这个选项就有用了

STRICT_TRANS_TABLES

在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非 事务表不做限制

NO_ZERO_IN_DATE

在严格模式下,不允许日期和月份为零

NO_ZERO_DATE

设置该值,mysql 数据库不允许插入零日期,插入零日期会抛出错误而不是警告

ERROR_FOR_DIVISION_BY_ZERO

在 INSERT 或 UPDATE 过程中,如果数据被零除,则产生错误而非警告。如 果 未给出该模式,那么数据被零除时MySQL 返回 NULL

NO_AUTO_CREATE_USER

禁止 GRANT 创建密码为空的用户

NO_ENGINE_SUBSTITUTION

如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认 的存储引擎替代,并抛出一个异常

PIPES_AS_CONCAT

将"||"视为字符串的连接操作符而非或运算符,这和 Oracle 数据库是一样的, 也和字符串的拼接函数 Concat 相类似

ANSI_QUOTES

启用 ANSI_QUOTES 后,不能用双引号来引用字符串,因为它被解释为识别符

ORACLE

设 置 等 同 于 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS,NO_TABLE_OPTIONS, NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER

查看当前的 sql_mode: select @@sql_mode;

修改

临时修改:set @@sql_mode=’’;

永久修改:要在配置文件 my.cnf中修改: [mysqld] 下添加sql_mode='' 然后重启 mysql 即可

用户权限

用户相关

命令

描述

备注

create user guest identified by 'guest';

创建名称为guest 的用户, 密码设为 guest;

select host,user,password,select_priv,insert_priv,drop_priv from mysql.user;

查看用户和权限的相关信 息

set password =password('123456')

修改当前用户的密码

update mysql.user set password=password('123456') where user='li4';

修改其他用户的密码

所有通过 user 表的修改,必须用 flush privileges; 命令才能生效

update mysql.user set user='li4' where user='wang5';

修改用户名

所有通过 user 表的修改,必须用 flush privileges; 命令才能生效

drop user li4

删除用户

不要通过 delete from user u where user='li4' 进行删除,系统会有残留信息保留。

权限管理

授予权限

命令

描述

grant 权限 1,权限 2,…权限 n on 数据库名称. 表名称 to 用户名@ 用户地址 identified by ‘连接口令’

该权限如果发现没有该用户,则会直接新建一个用户。 示例:grant select,insert,delete,drop on atguigudb.* to li4@localhost ; 给 li4 用户用本地命令行方式下,授予 atguigudb 这个库下的所有表的插删改查的权限。

# 授予通过网络方式登录的的 guest用户 ,对所有库所有表的全部权 限,密码设为 guest.

grant all privileges on *.* to guest@'%' identified by 'guest';

收回权限

命令

描述

show grants

查看当前用户权限

revoke [权限 1,权限 2,…权限 n] on 库名.表名 from 用户名@用户地址 ;

收回权限命令

# 收回全库全表的所有权限REVOKE

REVOKE ALL PRIVILEGES ON mysql.* FROM guest@localhost;

# 收回 mysql 库下的所有表的插删改查权限

REVOKE select,insert,update,delete ON mysql.* FROM guset@localhost;

mysql like 原理_MySql原理相关推荐

  1. mysql auto_increment 原理_mysql原理之Auto_increment

    引言 MySQL中auto_increment字段估计大家都经常用到,特别是innodb引擎.我也经常用,只知道mysql可以保证这个字段在多进程操作时的原子性,具体原理又是什么,后来查阅了MySQL ...

  2. mysql mdl 锁_mysql原理 ~ 细说 MDL锁

    一 简介: MDL锁 二 分类 1 MDL读锁 MDL读锁是相互兼容的 SHARED_READ 2 MDL 写锁 MDL写锁是互斥的 EXCLUSIVE 三 针对目标 1 目标 MDL锁是针对语句级别 ...

  3. mysql权限系统的工作原理_Mysql权限系统工作原理

    MySQL权限系统保证所有的用户可以严格地做他们假定被允许做的事情.当你连接一个MySQL服务器时, 你的身份由你从那连接的主机和你指定的用户名来决定,系统根据你的身份和你想做什么来授予权限. MyS ...

  4. mysql 字符串 底层_Mysql 的索引底层原理及数据结构详解

    Mysql 的索引底层原理 1.什么是索引? 索引是一种排好序的数据结构,mysql目前默认使用的是b+树. 2.为什么使用b+树? 例如表table 数据 id name 1 zs 2 ls 3 s ...

  5. mysql的备份恢复原理_MySQL备份恢复-mysqldump原理

    +++++++++++++++++++++++++++++++++++++++++++ 标题:mysqldump对MySQL数据库备份恢复原理 时间:2019年2月23日 内容:mysqldump工具 ...

  6. 为了把mysql的索引底层原理讲清楚,我把计算机翻了个底朝天

    来自:非科班的科班 什么是索引 概念:索引是提高mysql查询效率的数据结构.总的一句话概括就是索引是一种数据结构. 数据库查询是数据库的最主要功能之一.设计者们都希望查询数据的速度能尽可能的快,因此 ...

  7. MySQL事务ACID实现原理

    照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,ACID嘛,原子性(Atomicity).一致性(Consistency).隔离性(Isolati ...

  8. MySQL的MVCC底层原理二

    承接上文MySQL的MVCC底层原理 上文说到时序图中的第12步这篇文章咱接着聊完 时序图 图1 时序图第12步中的查询事务的read-view情况 图2 read-view为[100,200],30 ...

  9. MySQL的MVCC底层原理

    MySQL的MVCC底层原理 图1 这是一个account表 有id和name字段 图2 MySQL底层会给表添加2个字段 一个是trx id(事务id)一个是roll pointer(回滚指针) 事 ...

  10. mysql数据库ACID实现原理

    说到事物的四大特性原子性.一致性.隔离性.持久性,懂的人很多,但是稍微涉及细节,四大特性在数据库中的实现原理是怎么实现的?几乎很少有人能够答上来.所以这里着重讨论下mysql中的实现原理. 问题一:M ...

最新文章

  1. 利用属性封装复杂的选项
  2. IP地址的划分和配置路由
  3. python 文件大小,获取时间
  4. linux C库编译
  5. crt上传数据_用SecureCRT来上传和下载数据
  6. RHEL6入门系列之十一,内/外部命令、重定向、管道
  7. SIFT算法总结:用于图像搜索
  8. SAP Spartacus central configuration - B2cStorefrontModule
  9. IIS7.5和IIS8如何设置FTP的pasv端口范围
  10. java 整型变量,Java 整型变量
  11. logistic regression_【科研加油站】SPSS操作之有序Logistic回归的详细教程
  12. CIO思考:混合云为行业注入了哪些活力?
  13. rk3399_android7.1的HDMI显示实现固定分辨率
  14. 【滤波器】基于matlab GUI高通+低通+带通+带阻FIR滤波器设计【含Matlab源码 092期】
  15. SQL文件导入数据库【保姆级教程】
  16. 金蝶k3服务器维护,金蝶k3问题处理-完整版.docx
  17. matlab 声卡输出,请问高手关于matlab控制声卡输出的问题
  18. webpack打包工具的基本使用
  19. python飞机大战碰撞检测_pygame制作飞机大战4——敌机出现、碰撞检测、增加声音、分数记录...
  20. Qt数据库应用23-个人信息报表

热门文章

  1. maven日记(一):Maven使用入门
  2. Pycharm 下载模块中出现的 Error 解决方法
  3. ecshop 模板支持php,ecshop模板文件不支持php语句解决办法
  4. Python课堂点名器,妈妈再也不会担心我被老师点名了
  5. 无人机生成地图_无人机配方向传感器可自行创建地图+规划路线
  6. 产品目标拆解:结构化思维
  7. win10 hao123劫持html文件,Win10 edge浏览器主页被hao123劫持怎么解决?
  8. 另一个视角看春节红包大战,为什么说智能云是百度第二增长引擎
  9. Dell OptiPlex台式机安装ESXI 6.7
  10. vim 怎么显示空格_vi查看空格、制表符等特殊符号