mysql执行计划

Mysql数据结构

房东的猫 提交于 2019-12-17 10:31:35
文章目录 数据页 数据库中的存储结构 数据页的结构 从数据页结构的角度看B+树 结构-决定特性 磁盘IO 数据库缓冲池 缓冲池的一些命令查看 数据页加载的三种方式 结构-决定特性 数据页 数据库中的存储结构 记录是按照行来存储的,但是数据库的读取并不以行为单位,在数据库中,不论读一行,还是读多行,都是将这些行所在的页进行加载。也就是说,数据库管理存储空间的基本单位是页(Page)。 一个页中可以存储多个行记录(Row),同时在数据库中,还存在着区(Extent)、段(Segment)和表空间(Tablespace)。行、页、区、段、表空间的关系如下图所示: 页(Page) :用来存储数据表达形式行的空间,一页可以存在多个行,每一种数据库或数据引擎对于页的大小定义是不一样的,Sql Server的页大小为8K,、Oralce 支持的块大小为 2KB,4KB,8KB,16KB,32KB 和 64KB、InnoDB为16K。 区(Extent) :是比页大一级的我存储结构,在InnoDB引擎中,一个区会分配64个连续的页,不同的引擎上的页默认大小不一致,在InnoDB默认大小为16KB,一个区的大小也就是1M 段(Segment) :是由一个区或多个区组成,段并不需要区是连续的,段是数据库的分配单位,创建表的时候会创建一个表段,创建一个索引的时候会创建一个索引段。 表空间

【转-mysql-explain介绍】

萝らか妹 提交于 2019-12-17 05:29:42
explain显示了 MySQL 如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 先解析一条sql语句,看出现什么内容 EXPLAIN SELECT s . uid , s . username , s . name , f . email , f . mobile , f . phone , f . postalcode , f . address FROM uchome_space AS s , uchome_spacefield AS f WHERE 1 AND s . groupid = 0 AND s . uid = f . uid 1. id SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序,看下面这条sql EXPLAIN SELECT * FROM ( SELECT * FROM uchome_space LIMIT 10 ) AS s 它的执行结果为 可以看到这时的id变化了 2.select_type   select类型,它有以下几种值   2.1 simple 它表示简单的select,没有union和子查询   2.2 primary 最外面的select,在有子查询的语句中,最外面的select查询就是primary,上图中就是这样   2.3 union

MYSQL explain详解

不问归期 提交于 2019-12-17 03:24:23
转自:http://blog.csdn.net/zhuxineli/article/details/14455029,就是做个笔记,收藏下。 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 先解析一条sql语句,看出现什么内容 EXPLAIN SELECT s . uid , s . username , s . name , f . email , f . mobile , f . phone , f . postalcode , f . address FROM uchome_space AS s , uchome_spacefield AS f WHERE 1 AND s . groupid = 0 AND s . uid = f . uid 1. id SELECT识别符。这是SELECT查询序列号。这个不重要,查询序号即为sql语句执行的顺序,看下面这条sql EXPLAIN SELECT * FROM ( SELECT * FROM uchome_space LIMIT 10 ) AS s 它的执行结果为 可以看到这时的id变化了 2.select_type select类型,它有以下几种值 2.1 simple 它表示简单的select,没有union和子查询 2.2 primary

mysql语句优化

别说谁变了你拦得住时间么 提交于 2019-12-16 23:50:23
=============================sql语句优化和索引=========================== 1.Innerjoin和左连接,右连接,子查询 A. inner join内连接也叫等值连接是,left/rightjoin是外连接。 SELECT A.id,A.name,B.id,B.name FROM A LEFT JOIN B ON A.id =B.id; SELECT A.id,A.name,B.id,B.name FROM A RIGHT JOIN ON B A.id= B.id; SELECT A.id,A.name,B.id,B.name FROM A INNER JOIN ON A.id =B.id; 经过来之多方面的证实inner join性能比较快,因为inner join是等值连接,或许返回的行数比较少。但是我们要记得有些语句隐形的用到了等值连接,如: SELECT A.id,A.name,B.id,B.name FROM A,B WHERE A.id = B.id; 推荐:能用inner join连接尽量使用inner join连接 -------------------------------------------------------------------------------------------------

MySQL查询优化

*爱你&永不变心* 提交于 2019-12-16 23:11:54
转自:http://blog.csdn.net/kevinlifeng/article/details/43233227 声明是自己学习不是原创,望大家支持原创。 Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A. inner join内连接也叫等值连接是,left/rightjoin是外连接。 SELECT A.id,A.name,B.id,B.name FROM A LEFT JOIN B ON A.id =B.id; SELECT A.id,A.name,B.id,B.name FROM A RIGHT JOIN ON B A.id= B.id; SELECT A.id,A.name,B.id,B.name FROM A INNER JOIN ON A.id =B.id; 经过来之多方面的证实inner join性能比较快,因为inner join是等值连接,或许返回的行数比较少。但是我们要记得有些语句隐形的用到了等值连接,如: SELECT A.id,A.name,B.id,B.name FROM A,B WHERE A.id = B.id; 推荐:能用inner join连接尽量使用inner join连接 B.子查询的性能又比外连接性能慢,尽量用外连接来替换子查询。 Select* from A where exists (select *

Explain详解与索引最佳实践

混江龙づ霸主 提交于 2019-12-16 22:23:54
相信大多数的java开发程序员,日常工作,免不了涉及数据库的增删改查。而当你写完一句查询语句后,你肯定在想,如果可以事先知道该语句的执行效率,那就可以一定程度上避免设计出糟糕的语句了。那这种工具有吗?还真的有,那就是Explain。 使用EXPLAIN关键字可以模拟数据库优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈。在 select 语句之前增加 explain 关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL。 Explain分析实战 说明下实验环境,博主使用的mysql数据库为8.0.18 MySQL Community Server - GPL,运行在阿里云的centos服务器上。 数据库初始化脚本如下,创建了三张表,student学生信息表,course课程信息表,stuent_course学生选课评教表。 DROP TABLE IF EXISTS ` student ` ; CREATE TABLE ` student ` ( ` id ` bigint ( 14 ) NOT NULL , ` name ` varchar ( 45 ) NOT NULL , ` sex ` CHAR ( 1 ) NOT NULL , PRIMARY KEY ( ` id ` ) ) ENGINE = InnoDB DEFAULT

MySQL EXPLAIN详解

别来无恙 提交于 2019-12-16 21:43:51
前言: MySQL EXPLAIN命令是查询性能优化不可缺少的一部分,该文主要讲解explain命令的使用及相关参数说明。 EXPLAIN Output Columns: 列名 说明 id 执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置 select_type 显示本行是简单或复杂select。如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNION RESUlT) table 访问引用哪个表(引用某个查询,如“derived3”) type 数据访问/读取操作类型(ALL、index、range、ref、eq_ref、const/system、NULL) possible_keys 揭示哪一些索引可能有利于高效的查找 key 显示mysql决定采用哪个索引来优化查询 key_len 显示mysql在索引里使用的字节数 ref 显示了之前的表在key列记录的索引中查找值所用的列或常量 rows 为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值相乘,可粗略估算整个查询会检查的行数 Extra 额外信息,如using index、filesort等 id:

数据库之锁详解

一曲冷凌霜 提交于 2019-12-16 14:14:12
一、概述 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别。MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁定,行级锁定和页级锁定。 1.表级锁定(table-level) 表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。 当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并发度大打折扣。 使用表级锁定的主要是MyISAM,MEMORY,CSV等一些非事务性存储引擎。 2.行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小

PHP 之Mysql优化

别等时光非礼了梦想. 提交于 2019-12-16 13:23:18
一、建立索引 普通索引 index: 对关键字没有要求。 唯一索引 unique index: 要求关键字不能重复。同时增加唯一约束。 主键索引 primary key: 要求关键字不能重复,也不能为NULL。同时增加主键约束。 全文索引 fulltext key: 关键字的来源不是所有字段的数据,而是从字段中提取的特别关键词。 索引的管理: 建表时 更新表结构 1、前缀索引 建立前缀索引的语法: alter table test add KEY (name(5)); name一定是字符类型(索引字段),5为长度 那好,如何确定取前面几个字符呢?显然,这个场景是一个观察的结果,也就是说,必须要有一定量的实际数据,我们才能分析出其规律,也就是说这个索引是在后期优化得来的,前期没必要建立。 计算不重复的概率: select COUNT(DISTINCT name) / COUNT(*) as rate from test; 找出接近rate的一个n(试出最合理的n) select COUNT(DISTINCT LEFT(name, 3)) / COUNT() as rate3 from test; select COUNT(DISTINCT LEFT(name, 5)) / COUNT() as rate5 from test; select COUNT(DISTINCT LEFT

7 MySQL的维护、性能优化

不想你离开。 提交于 2019-12-16 03:14:56
《MySQL实战45讲》 Rows_examined:https://blog.csdn.net/weixin_34332905/article/details/90683568 恢复数据库:https://blog.51cto.com/laobaiv1/1960846 性能优化:https://www.cnblogs.com/angelica-duhurica/p/11303281.html 1 MySQL有哪些“饮鸩止渴”提高性能的方法 1.1 短连接风暴 解决: 方法1 先处理掉那些占着连接但是不工作的线程。 建议是处理掉查询任务之类的连接,插入的就不处理,避免数据库状态有损 方法2 减少连接过程的消耗。 让数据库跳过权限验证阶段 1.2 慢查询性能问题 在MySQL中,会引发性能问题的慢查询,有以下三种可能: 索引没有设计好; SQL语句没写好; MySQL选错了索引。 1.2.1 索引没有设计好 ⼀般通过紧急创建索引来解决 MySQL 5.6版本以后,创建索引都支持Online DDL了,对于那种高峰期数据库已经被这个语句打挂了的情况,最高效的做法就是直接执行alter table 语句。 比较理想的是能够在备库先执行; 假设现在的服务是⼀主⼀备:主库A、备库B,这个方案的大致流程是这样的: 在备库B上执行 set sql_log_bin=off ,也就是不写binlog