mysql执行计划

Mysql innodb索引与查询优化

只谈情不闲聊 提交于 2020-01-01 04:53:36
一、 引言 概要 (1) innodb索引类型与B+树 (2) 索引使用注意事项 (3) 车点评业务表索引优化案例 问题 (1) InnoDb索引为什么要用b+树? (2) 聚集索引与普通索引有什么区别? (3) 为什么主键最好是自增? (4) 组合索引有什么优势? (5) 有哪些实际业务场景索引搞不定? 二、 innodb索引类型与B+树 INNODB主要有几种索引:B+树索引,自适应哈希索引,全文索引 ,覆盖索引。 B+树索引是一种多叉平衡查找树。 自适应哈希索引是mysql对于频繁查询的数据采取的hash存储优化,用户无法选择设置。 全文索引主要用于全文检索使用。 覆盖索引说的是查询的字段都属于同一个索引字段,这样效率非常高。 查找树 查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然会提高查找效率。 B 树 /B+ 树 /B* 树 B树 B+树 所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 数据库索引采用B

(七)MySQL索引和执行计划

不羁岁月 提交于 2020-01-01 04:22:05
索引 和 EXPLAIN/DESC 概念 索引 是对 数据库 表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息 索引分为聚簇索引和非聚簇索引两种 聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快 MyISAM:非聚簇索引 非聚簇索引的 主索引和辅助索 引几乎是一样的,只是主索引不允许重复,不允许空值,他们 的叶子结点的key都存储指向键值对应的数据的物理地址 非聚簇索引的数据表和索引表是分开存储的 非聚簇索引中的数据是根据数据的插入顺序保存。因此非聚簇索引更适合单个数据的查询。插入顺序不受键值影响 只有在MyISAM中才能使用FULLTEXT索引 InnoDB:聚簇索引 聚簇索引的 主索引的叶子结点存储的是键值对应的数据本身,辅助索引的叶子结点存储的是键值对应的数据的主键键值 。因此主键的值长度越小越好,类型越简单越好 聚簇索引的数据和主键索引存储在一起。 聚簇索引的数据是根据主键的顺序保存。因此适合按主键索引的区间查找,可以有更少的磁盘I/O,加快查询速度。但是也是因为这个原因,聚簇索引的插入顺序最好按照主键单调的顺序插入,否则会频繁的引起页分裂,严重影响性能。 在InnoDB中

主从复制1062错误的解决方法

落爺英雄遲暮 提交于 2020-01-01 03:16:58
现在不少公司都在用MySQL(master)-->MySQL(slave)的框架,当然也有一主多从的架构,这也是MySQL主从的一个延伸架构;当然也有的公司MySQL主主的架构,MySQL主主架构要是处理得不适当,会面临各种各样的问题,当然啦,每种数据库构架都有自己的优缺点,合适自己公司业务需求的且方便自己维护的架构都可以认为是理想的构架,当出现同步断开了,我们是不是一味的使用 --slave-skip-errors=[error_code] 来跳过错误代码呢?其实不是的,这样做可能会造成数据不一致的可能,下面我只针对MySQL Replication常见的错误进行说明及处理。 一、在master上更新一条记录时出现的故障 ( master与slave处理同步的情况下,binlog为row格式 ) 在slave库上,模拟slave少了一条数据,所以把id=6的记录在slave上先delete掉: root@mysql-slave> select * from test; +----+------+----------+ | id | name | code | +----+------+----------+ | 6 | aa | 10002011 | | 7 | bb | 10002012 | | 8 | cc | 10002013 | | 9 | dd | 10002014 |

MySQL性能优化

喜你入骨 提交于 2020-01-01 00:43:07
SQL语句优化-explain分析问题 Explanin select * from user 会产生如下信息: id:查询的序列号 select_type:表示查询的类型。 table:输出结果集的表 type:表示表的连接类型 possible_keys:表示查询时,可能使用的索引 key:表示实际使用的索引 key_len:索引字段的长度 ref: 哪个字段或常数与 key 一起被使用 rows:扫描出的行数 Extra:执行情况的描述和说明 select_type列说明 SIMPLE, 表示此查询不包含 UNION 查询或子查询 PRIMARY, 表示此查询是最外层的查询 UNION, 表示此查询是 UNION 的第二或随后的查询 DEPENDENT UNION, UNION 中的第二个或后面的查询语句, 取决于外面的查询 UNION RESULT, UNION 的结果 SUBQUERY, 子查询中的第一个 SELECT DEPENDENT SUBQUERY: 子查询中的第一个 SELECT, 取决于外面的查询. 即子查询依赖于外层查询的结果. type列说明 通常来说, 不同的 type 类型的性能关系如下: ALL < index < range ~ index_merge < ref < eq_ref < const < system MySQL性能优化之慢查询 介绍

MySQL快速入门(四)

折月煮酒 提交于 2020-01-01 00:16:35
1 事务处理 接下来我会带大家一起来熟悉mysql中的事务处理机制 1.1 事务概述 l 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表 才支持事务 。 l 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 l 事务用来管理 DDL、DML、DCL操作,比如 insert,update,delete 语句 一般来说,事务必须满足四个条件 1. Atomicity (原子性) 原子性: 构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。 2. Consistency (稳定性、一致性) 稳定性 (一致性) : 数据库在事务执行前后状态都必须是稳定的。 3. Isolation (隔离性) 隔离性: 事务之间不会相互影响。 4. Durability (可靠性、持久性) 可靠性 (持久性) : 事务执行成功后必须全部写入磁盘 。 1.2 MySQL事务支持 常见的操作有三步 1. BEGIN或START TRANSACTION;显式地开启一个事务; 2. COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的; 3. ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务

常用的 19 条 MySQL 优化

自作多情 提交于 2019-12-31 23:55:11
一、EXPLAIN 做MySQL优化,我们要善用 EXPLAIN 查看SQL执行计划。 下面来个简单的示例,标注(1,2,3,4,5)我们要重点关注的数据 type列,连接类型。一个好的sql语句至少要达到range级别。杜绝出现all级别 key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式 key_len列,索引长度 rows列,扫描行数。该值是个预估值 extra列,详细说明。注意常见的不太友好的值有:Using filesort, Using temporary 二、SQL语句中IN包含的值不应过多 MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:select id from table_name where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了;再或者使用连接来替换。 三、SELECT语句务必指明字段名称 SELECT *增加很多不必要的消耗(cpu、io、内存、网络带宽);增加了使用覆盖索引的可能性;当表结构发生改变时,前断也需要更新。所以要求直接在select后面接上字段名。 四、当只需要一条数据的时候,使用limit 1 这是为了使EXPLAIN中type列达到const类型 五

神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(二)

淺唱寂寞╮ 提交于 2019-12-30 09:25:12
开心一刻   一头母牛在吃草,突然一头公牛从远处狂奔而来说:“快跑啊!!楼主来了!”   母牛说:“楼主来了关我屁事啊?”   公牛急忙说:“楼主吹牛逼呀!”   母牛大惊,拔腿就跑,边跑边问:“你是公牛你怕什么啊?”   公牛无奈道:“现在的楼主不仅吹牛逼,还扯蛋!”   然后小牛也在跟着跑,公牛和母牛问:“儿子你跑什么呢?”   小牛说:“楼主还扯犊子啊” 前情回顾    神奇的 SQL 之 联表细节 → MySQL JOIN 的执行过程(一) 中,我们讲到了 JOIN 的部分内容,像:驱动表、JOIN 大致流程等。什么,还没看?赶紧去看呀,啊? 你都知道呀,那你走吧   走就走,你把欠的内容还上我就走;我欠什么了? 我欠,我欠... 我好像是欠点东西     1、BKA(Batched Key Access)     2、ON 和 WHERE   请各位坐好,我要开始表演了 环境准备   数据库: MySQL 5.7 . 1   存储引擎: InnoDB   建表和初始化数据 -- 查看版本和存储引擎 SELECT VERSION(); SHOW ENGINES; SHOW VARIABLES LIKE '%storage_engine%'; -- 表创建与数据初始化 DROP TABLE IF EXISTS tbl_user; CREATE TABLE tbl_user (

mysql------explain工具

余生长醉 提交于 2019-12-30 01:46:39
基于mysql5.7,innodb存储引擎 使用explain关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返 回执行计划的信息,而不是执行这条SQL ,如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中 使用到的建表语句文末 explain select * from actor; 在查询中的每个表会输出一行,如果有两个表通过 join 连接查询,那么会输出两行 explain结果字段说明 1. id列 id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的 顺序增长的。 id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。 2. select_type列 select_type 表示对应行是简单还是复杂的查询。 1)simple:简单查询。查询不包含子查询和union 2)primary:复杂查询中最外层的 select 3)subquery:包含在 select 中的子查询(不在 from 子句中) 4)derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为 派生表(derived的英文含义) 5)union:在

MySQL之Explain(执行计划)

微笑、不失礼 提交于 2019-12-30 01:45:41
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库 1.explain(查看执行计划):使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySql是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。   (1.)能干嘛?        (2.)怎么玩     1.Explain+SQL语句     2.执行计划包含的信息    2.各名词解释   (1)id        一.第一种情况            二.第二种情况             三.第三种情况             (2).select_type     一.有哪些     simple: 简单的select查询,查询中不包括子查询或者union     primary: 查询中若包含任何复杂的子部分,最外层查询则被标记为     subQuery: 在select或where列表中包括子查询     derived: 在from列表中包括的子查询被标记为derived

MySQL快速入门(三)

我的梦境 提交于 2019-12-30 00:16:15
1. 性能优化 1.1 MySQL索引 什么是索引? 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含 着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录, 能加快数据库的查询速度。 索引分类: ①单列索引:一个索引只包含单个列,一个表可以有多个单列索引 ②组合索引:一个索引包含多个列 索引的使用 创建索引 create index indecName on tableName(userName(length))’ 修改索引 alter table tableName add index indexName(columnName) 删除索引 drop index indexName on tableName 1.2 explain 命令 explain命令介绍 explain命令显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句,使用方法在select语句前加上explain就可以了. 示例: Mysql执行计划的图解: 1.3 慢查询 1. 什么是慢查询? MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。具体环境中,运行时间超过long_query_time值的SQL语句,则会被记录到慢查询日志 中