mysql执行计划

MYSQL性能调优

允我心安 提交于 2019-11-29 03:43:32
摘要 为了学习研究MySQL数据库在工作原理,深刻理解MySQL在企业运用时如何保证其高效运行。分别从表结构的优化,SQL语句的优化,存储引擎的选择,索引的优化以及现今MySQL的发展与其他企业级数据库的比较。介绍了从编码选择到数据类型的选择以及从整体的角度设计表结构。在SQL语句的选择和使用的介绍的时候,深入介绍了一些基本的使用原则以及在一般在使用过程中我们存在的误区以及如何解决这些问题。着重介绍了MySQL的几个存储引擎MyISAM、InnoDB和NDBCluster的差异以及各自的适用范围。有介绍了MySQL的索引的一些优化的建议以及高屋建瓴地阐述和比较了MySQL的优劣和发展态势。 前言 数据库作为应用作为广泛,地位极为重要的中间件应用,学习和使用数据库管理系统变得越来越重要。为了研究和总结对mysql数据库的学习结果,特别从数据表结构、sql语句优化、存储引擎的选择、索引的应用、以及mysql的比较总结对mysql技术做了一个比较全面升入的介绍。使用mysql的过程中,如何更好地使用与优化越来越重要,在这篇文章中就阐述。 第一章 表结构的优化 数据表是数据库的具体表现形式,设计优良的数据库拥有良好的表结构,者不单单指数据库的表需要满足范式结构,为了更有利于具体操作,表结构还需要实际的可扩展性,以便于做增删改查,又需要根据数据表的具体作用做出调节

Mysql中InnoDB存储引擎索引

风格不统一 提交于 2019-11-29 01:55:08
1.索引是什么: 索引用于快速找出在某个列中有某一特定值的行。 2.索引的优缺点: 优点:索引能够有效地提高查询的效率; 缺点:索引过多也会影响应用程序的性能。 3.索引的分类: 按索引包含列的个数可以分为 (1)单列索引(一个索引只包含一个列,但一个表可以有多个单列索引) (2)组合索引(一个组合索引包含两个或者两个以上的列) 只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。 我们创建一张menu表 CREATE TABLE `menu` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '菜单id', `sid` bigint(20) DEFAULT NULL COMMENT '系统id', `name` varchar(255) DEFAULT NULL COMMENT '菜单名', `pid` bigint(20) DEFAULT NULL COMMENT '父菜单', `type` tinyint(4) DEFAULT NULL COMMENT '类型(1:一级菜单 2:二级菜单)', `url` varchar(255) DEFAULT NULL COMMENT '菜单url', `sort` int(11) DEFAULT NULL COMMENT '排序', PRIMARY

索引

China☆狼群 提交于 2019-11-29 00:51:50
一、索引的介绍 数据库中专门用于帮助用户快速查找数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置吗,然后直接获取。 二 、索引的作用 约束和加速查找 三、常见的几种索引: - 普通索引 - 唯一索引 - 主键索引 - 联合索引(多列) - 联合主键索引   - 联合唯一索引    - 联合普通索引 无索引: 从前往后一条一条查询 有索引:创建索引的本质,就是创建额外的文件(某种格式存储,查询的时候,先去格外的文件找,定好位置,然后再去原始表中直接查询。但是创建索引越多,会对硬盘也是有损耗。 建立索引的目的: a.额外的文件保存特殊的数据结构 b.查询快,但是插入更新删除依然慢 c.创建索引之后,必须命中索引才能有效索引的种类 hash索引和BTree索引 (1)hash类型的索引:查询单条快,范围查询慢 (2)btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它) 普通索引 create index 索引的名字 on 表名(列名)删除索引 drop index 索引的名字 on 表名查看索引 show index from 表名 3.2 唯一索引 唯一索引有两个功能:加速查找和唯一约束(可含null) 创建表+主键索引 create table userinfo( id int not null

MySQL数据库设计规范

时光毁灭记忆、已成空白 提交于 2019-11-29 00:31:42
MySQL数据库设计规范 目录 1. 规范背景与目的 2. 设计规范 2.1 数据库设计 2.1.1 库名 2.1.2 表结构 2.1.3 列数据类型优化 2.1.4 索引设计 2.1.5 分库分表、分区表 2.1.6 字符集 2.1.7 程序DAO层设计建议 2.1.8 一个规范的建表语句示例 2.2 SQL编写 2.2.1 DML语句 2.2.2 多表连接 2.2.3 事务 2.2.4 排序和分组 2.2.5 线上禁止使用的SQL语句 1. 规范背景与目的 MySQL数据库与 Oracle、 SQL Server 等数据库相比,有其内核上的优势与劣势。我们在使用MySQL数据库的时候需要遵循一定规范,扬长避短。本规范旨在帮助或指导RD、QA、OP等技术人员做出适合线上业务的数据库设计。在数据库变更和处理流程、数据库表设计、SQL编写等方面予以规范,从而为公司业务系统稳定、健康地运行提供保障。 2. 设计规范 2.1 数据库设计 以下所有规范会按照【高危】、【强制】、【建议】三个级别进行标注,遵守优先级从高到低。 对于不满足【高危】和【强制】两个级别的设计,DBA会强制打回要求修改。 2.1.1 库名 【强制】库的名称必须控制在32个字符以内,相关模块的表名与表名之间尽量提现join的关系,如user表和user_login表。 【强制】库的名称格式:业务系统名称_子系统名

Mysql优化-索引

假如想象 提交于 2019-11-28 21:49:01
1. 索引的本质   MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构。   数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度尽可能的快,因此 数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法是顺序查找(liner search),这种复杂度为o(n)的算法在数据量大时,速度很慢。但是我们有更优秀的查找算法,例如二分查找(binary search)、二叉树查找(binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉查找只能应用于二叉查找树上,但是数据本身的组织结构不可能满足各种数据结构(例如,一般不可能同时将两列都按顺序进行组织),所以在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实训高级查找算法。这种数据结构,就是索引。   为了加快查询速度,可以维护一个二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在o(logN)的复杂度内获取到相应数据。   虽然这是一个货真价实的索引,但是实际的数据库系统几乎没有使用二叉查找树实现的。。。 二叉排序树   二叉排序树的排序规则如下:   1)若左子树不空

mysql explain执行计划详解

心已入冬 提交于 2019-11-28 20:08:41
1)、id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询。 2)、select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个 C:union:union连接的两个select查询,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union D:dependent union:与union一样,出现在union 或union all语句中,但是这个查询要受到外部查询的影响 E:union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null F:subquery:除了from字句中包含的子查询外,其他地方出现的子查询都可能是subquery G:dependent subquery:与dependent union类似,表示这个subquery的查询要受到外部表查询的影响 H:derived:from字句中出现的子查询,也叫做派生表

MySQL优化

懵懂的女人 提交于 2019-11-28 19:20:55
MySQL优化 增加冗余字段,空间换时间 varchar(10)和varchar(255) 都存储相同的数据,连表查询时,varchar(255)更占内存 字段避免存null,不走索引 索引类型 Btree 索引 - 表的索引会生成一个单独的数据结构,类似于二叉树结构存储,每个节点存储key(索引)和指向数据的地址(真正表中的数据地址) - btree索引常见误区:把where后常用列都加上索引,如果where id =1 and age > 20,其实最终查询只会用到一个索引,mysql的独立索引同时只能用到一个。 - 建议建立多列联合索引,但是要注意,联合索引要满足左前缀原则 注:group by ,order by 也要遵循左前缀原则 - 可以提高排序速度,因为索引树本来就是有顺序,根据顺序从表中以此取出 - 可以提高分组速度,要分组必须先排序 hash 索引 每条数据有对应的hash,查询单一数据效率高,但是查询范围效率低,无法利用前缀索引,每次查询都必须回行,索引树只查询数据位置 索引类型 聚簇索引 innodb 主键索引和行数据一起存放,找到索引就找到数据,不需要回行, 主键索引和数据存放在一起,如果通过主键索引查找,找到索引就等于找到数据,如果通过其他索引,二级索引或者次索引,会找到对主键索引的引用,然后获取数据 默认主键索引 没有主键,用Unique key 做主键

Explain详解

人盡茶涼 提交于 2019-11-28 18:05:19
expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra 概要描述: id:选择标识符 select_type:表示查询的类型。 table:输出结果集的表 partitions:匹配的分区 type:表示表的连接类型 possible_keys:表示查询时,可能使用的索引 key:表示实际使用的索引 key_len:索引字段的长度 ref:列与索引的比较 rows:扫描出的行数(估算的行数) filtered:按表条件过滤的行百分比 Extra:执行情况的描述和说明 下面对这些字段出现的可能进行解释: 一、 id SELECT识别符。这是SELECT的查询序列号 我的理解是SQL执行的顺序的标识,SQL从大到小的执行 1. id相同时,执行顺序由上至下 2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 3. id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 二、select_type 示查询中每个select子句的类型 (1) SIMPLE(简单SELECT,不使用UNION或子查询等) (2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY

MySQL常见面试题索引与表设计

丶灬走出姿态 提交于 2019-11-28 17:53:31
1 索引概念、索引模型 Q: 你们每天这么大的数据量,都是保存在关系型数据库中吗? A: 是的,我 们线上使用的是MySQL数据库 Q: 每天几百万数据,一个月就是几千万了,那你们有没有对于查询做一些优化呢? A: 我们在数据库中创建了一些索引(我现在非常后悔我当时说了这句话) Q: 那你能说说什么是索引吗? A: 索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据 Q: 那么索引具体采用的哪种数据结构呢? A: 常见的MySQL主要有两种结构: Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树 Q: 既然你提到InnoDB使用的B+ 树的索引模型,那么你知道为什么采用B+ 树吗?这和Hash索引比较起来有什么优缺点吗? A: 因为Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。 所以,哈希索引只适用于等值查询的场景。 而B+ 树是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描 Q: 除了上面这个范围查询的,你还能说出其他的一些区别吗? A: B+ Tree索引和Hash索引区别? 哈希索引适合等值查询,但是无法进行范围查询

MySQL实战

旧巷老猫 提交于 2019-11-28 17:29:15
也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务。 就算重启成功了,对于问题的原因仍不知所以。 本文开始,记录学习《MySQL实战45讲》专栏的过程。 也许有人会问,你记录有什么意义?直接看专栏不就行了吗?你这不是啃别人的剩骨头吗? 是的,这个系列,我只是基于专栏学习,但是我会尽量从我的角度搞懂每一个知识点,遇到不懂得也会将知识点进行拆分。 我知道关注公众号的小伙伴也有很多购买了这个专栏的,我希望大家都能够利用好这个机会,把 MySQL 吃透! 看大家的反馈情况吧,若有需要,可以建个小群,大家互相讨论学习! 下面开始正文。 大家或多或少都用过 MySQL,起码 select 还是会用的吧,但是 select 执行后,MySQL 内部到底发生了什么,你知道吗? 比如,我们有个简单的表 T,它有个 ID 字段,那么我们可以执行下面的语句: 1 mysql> select * from T where ID=10; 语句执行很简单,但是具体到 MySQL 内部,其实是一个完整的执行流程。 从下图就可以清楚地看出 MySQL 的命令执行流程: 从该图可以看出,MySQL 主要分为 server 层和存储引擎层。 server 层中包含连接器,查询缓存,分析器,优化器,执行器,大多数核心功能以及内置函数,存储过程,触发器,视图等。