mysql执行计划

MySQL 索引机制

不问归期 提交于 2019-12-04 03:43:49
MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 MySQL InnoDB 锁 MySQL InnoDB MVCC MySQL InnoDB 实现高并发原理 MySQL InnoDB 快照读在RR和RC下有何差异 索引是什么? 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。 MySQL 的索引是硬盘级,索引数据是保存在硬盘上的,有部分数据可以放入缓存,后面的文章会描述到, InnerDB 有一个缓存池,缓存池的大小是可以通过配置文件配置。 我们通过下图来看看 MySQL 的索引是怎么工作的? 比如我们建了一张老师表,有 N 条数据,每条数据对应有一个磁盘地址,在没有引入索引机制的情况下,我们要查一条姓名等于王五的数据,我们需要一条一条比对老师表的所有数据,当老师表的数据量比较多时,全表比对检索的速度会非常慢。 这样我们就必须引入索引机制,比如我们对 id 建了一个索引,要查一条 id 等于101的数据,我们可以通过索引的数据结构快速检索出 id 等于101的磁盘地址,这样就可以通过磁盘地址快速定位到表中的数据。 为什么要用索引? 索引能极大的减少存储引擎需要扫描的数据量 索引可以把随机 IO 变成顺序 IO

MySQL架构总览->查询执行流程->SQL解析顺序

守給你的承諾、 提交于 2019-12-04 02:42:35
前言:   一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了。   本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来探讨一下其中的知识。 一、MySQL架构总览:   架构最好看图,再配上必要的说明文字。   下图根据参考书籍中一图为原本,再在其上添加上了自己的理解。 从上图中我们可以看到,整个架构分为两层,上层是MySQLD的被称为的‘SQL Layer’,下层是各种各样对上提供接口的存储引擎,被称为‘Storage Engine Layer’。其它各个模块和组件,从名字上就可以简单了解到它们的作用,这里就不再累述了。 二、查询执行流程   下面再向前走一些,容我根据自己的认识说一下查询执行的流程是怎样的: 1.连接   1.1客户端发起一条Query请求,监听客户端的‘连接管理模块’接收请求   1.2将请求转发到‘连接进/线程模块’   1.3调用‘用户模块’来进行授权检查   1.4通过检查后,‘连接进/线程模块’从‘线程连接池’中取出空闲的被缓存的连接线程和客户端请求对接,如果失败则创建一个新的连接请求 2.处理   2.1先查询缓存,检查Query语句是否完全匹配,接着再检查是否具有权限,都成功则直接取数据返回   2.2上一步有失败则转交给‘命令解析器’,经过词法分析,语法分析后生成解析树

MySQL 分表和表分区

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-03 20:16:28
为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致 数据库 在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。 什么是分区? 分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。 mysql 分表和分区有什么联系呢? 1.都能提高mysql的性高,在高并发状态下都有一个良好的表现。 2.分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大

mysql 8.3优化和索引

穿精又带淫゛_ 提交于 2019-12-03 17:28:16
MySQL如何使用索引 索引用于快速查找具有特定列值的行。 没有索引,MySQL必须从第一行开始,然后通读整个表以找到相关的行。 桌子越大,花费越多。 如果表中有相关​​列的索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据。 这比顺序读取每一行要快得多。 大多数MySQL索引( PRIMARY KEY , UNIQUE , INDEX 和 FULLTEXT )存储在 B树 。 例外:空间数据类型的索引使用R树; MEMORY 表还支持 哈希索引 ; InnoDB 对 FULLTEXT 索引 使用倒排列表 。 通常,如以下讨论中所述使用索引。 第8.3.8节“ B树和哈希索引的比较” MEMORY 中介绍了 哈希索引特有的特性(如 表中所 用 ) 。 MySQL使用索引进行以下操作: WHERE 快速 查找与 子句 匹配的行 。 从考虑中消除行。 如果可以在多个索引之间进行选择,MySQL通常会使用找到最少行数的 索引 (最具 选择性的 索引)。 如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行。 例如,如果你有一个三列索引上 (col1, col2, col3) ,你有索引的搜索功能 (col1) , (col1, col2) 以及 (col1, col2, col3) 。 有关更多信息,请参见 第8.3.5节“多列索引” 。

MYSQL补充

余生颓废 提交于 2019-12-03 14:55:30
1、视图 视图当作表 2、触发器 insert ... 3、存储过程 insert into tb1() update tb2... 事务:innodb p12(out status int): try: insert into tb1() update tb2... set status=1 except ...: set status=0 call p12() 4、函数 def func(arg): return arg + 100 select nid from student # 1,2,3,4,5,6... select func(nid) from student # 101,102,103,104 select func(1) # 101 函数: mysql内置函数 自定义函数 函数: SQL不允许 declare a int; # set a = 123; select nid into a from student where name='alex' # nid: 11 name:alex # a = 11 return 返回 # select 函数名(参数) 存储过程: sql语句 intout,out构造返回值 call: 存储过程名称 索引 功能: - 约束 - 主键 - 外键 - 唯一 - 普通 - 组合 - 加速查找 为什么索引可以这么快?

MySQL EXPLAIN的输出信息

帅比萌擦擦* 提交于 2019-12-03 11:53:22
MySQL EXPLAIN的输出信息 表结构 drop table article; drop table user; -- 最终的两个表的定义,authorId上没有任何索引(不是外键,也没有索引) create table article( id int auto_increment primary key, title varchar(255) not null, shortName varchar(255) not null, authorId int not null, createTime datetime not null, state int not null, totalView int default null, unique index idx_short_name_title (title,shortName) ); create table user ( id int auto_increment primary key, name varchar(255) not null, sex bit default 0, email varchar(50) not null, address varchar(255) default null, unique index idx_email (email), index idx_name (name) );

windows备份mysql数据库

≡放荡痞女 提交于 2019-12-03 11:10:56
1、编写执行文件mysql_backup.bat rem auther:ELSON ZENG rem date:20191104 rem mysql backup! @echo off set mysql_dump="C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe" set Ymd="%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%%TIME:~0,2%%TIME:~3,2%" set backup_path="D:\mysql_backup" rem 删除过期30天前的数据备份 forfiles /p %backup_path%\data /m backup_*.sql -d -30 /c "cmd /c del /f @path" rem 开始备份 %mysql_dump% -uroot -p123456 -P 3306 --all-databases --routines > "%backup_path%\data\backup_%Ymd%.sql" set var=%errorlevel% @echo on if %var% EQU 0 ( echo "%DATE:~0,4%-%DATE:~5,2%%DATE:~8,2%-%TIME:~0,2%%TIME:~3,2% backup

第二章· MySQL体系结构管理

我是研究僧i 提交于 2019-12-03 10:52:50
第二章· MySQL体系结构管理 一.客户端与服务器模型  1.mysql是一个典型的C/S服务结构 1.1 mysql自带的客户端程序(/application/mysql/bin) mysql mysqladmin mysqldump 1.2 mysqld一个二进制程序,后台的守护进程 单进程 多线程 2.应用程连接MySQL方式 TCP/IP的连接方式  套接字连接方式  思考:mysql -uroot -poldboy123是使用了哪个连接方式??? 二.MySQL服务器构成 什么是实例 1.MySQL的后台进程+线程+预分配的内存结构。 2.MySQL在启动的过程中会启动后台守护进程,并生成工作线程,预分配内存结构供MySQL处理数据使用。  图1.1-word的打开方式  图1.2-mysqld的打开方式 MySQLD服务器程序构成  mysqld是一个守护进程但是本身不能自主启动: [root@db01 ~]# mysql -uroot -poldboy123 [root@db01 ~]# select user,host,password from mysql.user; 连接层 1、提供连接协议(socket、tcp/ip) 2、验证用户的合法性(用户名、密码、白名单) 3、提供一个专用连接线程(接收SQL、返回结果),将SQL语句交给SQL层继续处理

mysql面试题

会有一股神秘感。 提交于 2019-12-03 10:38:32
1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 2、MySQL中myisam与innodb的区别,至少5点 (1)、问5点不同; (2)、innodb引擎的4大特性 (3)、2者selectcount(*)哪个更快,为什么 3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1)、varchar与char的区别 (2)、varchar(50)中50的涵义 (3)、int(20)中20的涵义 (4)、mysql为什么这么设计 4、innodb的事务与日志的实现方式 (1)、有多少种日志; (2)、事物的4种隔离级别 (3)、事务是如何通过日志来实现的,说得越深入越好。 5、问了MySQL binlog的几种日志录入格式以及区别 (1)、binlog的日志格式的种类和分别 (2)、适用场景; (3)、结合第一个问题,每一种日志格式在复制中的优劣。 6、问了下MySQL数据库cpu飙升到500%的话他怎么处理? (1)、没有经验的,可以不问; (2)、有经验的,问他们的处理思路。 7、sql优化 (1)、explain出来的各种item的意义; (2)、profile的意义以及使用场景; 8、备份计划,mysqldump以及xtranbackup的实现原理 (1)、备份计划; (2)、备份恢复时间; (3)

MySQL——通过EXPLAIN分析SQL的执行计划

南笙酒味 提交于 2019-12-03 09:17:34
转自: https://www.cnblogs.com/songwenjie/p/9409852.html 在MySQL中,我们可以通过 EXPLAIN 命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。 下面分别对 EXPLAIN 命令结果的每一列进行说明: select_type :表示SELECT的类型,常见的取值有: 类型 说明 SIMPLE 简单表,不使用表连接或子查询 PRIMARY 主查询,即外层的查询 UNION UNION中的第二个或者后面的查询语句 SUBQUERY 子查询中的第一个 table :输出结果集的表(表别名) type :表示MySQL在表中找到所需行的方式,或者叫访问类型。常见访问类型如下,从上到下,性能由差到最好: ALL 全表扫描 index 索引全扫描 range 索引范围扫描 ref 非唯一索引扫描 eq_ref 唯一索引扫描 const,system 单表最多有一个匹配行 NULL 不用扫描表或索引 type=ALL,全表扫描,MySQL遍历全表来找到匹配行 一般是没有where条件或者where条件没有使用索引的查询语句 EXPLAIN SELECT * FROM customer WHERE active=0; type=index,索引全扫描