mysql执行计划

mysql数据库专业术语说明

匿名 (未验证) 提交于 2019-12-02 21:59:42
1. 数据库简介: 数据库(database): 数据库是数据的汇集,它以一定的组织形式存于存储介质上。 补充说明: 数据库软件称为数据库管理系统(DBMS), DBMS实现数据库系统的各种功能,是数据库系统的核心。 关系型数据库: 各个数据之间存在关联是关系型数据库得名的主要原因。 当前主流的关系型数据库有Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。 非关系型数据: 非关系型的,分布式的,且一般不保证遵循ACID原则的数据存储系统。 有NoSql、Cloudant等。 2.关系型数据库常见术语: 行(row): 表是一种结构化的文件,可用于存储特定类型的数据,表中的每一行,也称为一条记录。 列(column): 表中的一个字段,所有表都是由一个或多个列组成的。表中的每一列,称为属性,字段。 索引: 将表中的一个或多个字段中的数据复制一份另存,并且按特定次序排序存储。 视图: 视图是虚拟的表。与包含数据的表不一样,视图只包含使用时动态检索数据的查询。 约束(constraint)条件: 表中的数据要遵守的限制。 主键: 一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行。 惟一键: 一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL,一个表可以存在多个 外键:

MySQL表锁和行锁

匿名 (未验证) 提交于 2019-12-02 21:59:42
锁粒度 MySQL 不同的存储引擎支持不同的锁机制,所有的存储引擎都以自己的方式显现了锁机制,服务器层完全不了解存储引擎中的锁实现: InnoDB 存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 MyISAM 和 MEMORY 存储引擎采用的是表级锁(table-level locking) BDB 存储引擎采用的是页面锁(page-level locking),但也支持表级锁 默认情况下,表锁和行锁都是自动获得的, 不需要额外的命令。 但是在有的情况下, 用户需要明确地进行锁表或者进行事务的控制, 以便确保整个事务的完整性,这样就需要使用事务控制和锁定语句来完成。 不同粒度锁的比较 表级锁 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 存储引擎通过总是一次性同时获取所有需要的锁以及总是按相同的顺序获取表锁来避免死锁。 表级锁更适合于以查询为主,并发用户少,只有少量按索引条件更新数据的应用,如Web 应用 行级锁 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 最大程度的支持并发,同时也带来了最大的锁开销。 在 InnoDB 中,除单个 SQL 组成的事务外,锁是逐步获得的,这就决定了在 InnoDB 中发生死锁是可能的。 行级锁只在存储引擎层实现

SQL优化指南

匿名 (未验证) 提交于 2019-12-02 21:59:42
慢查询日志 开启撒网模式 开启了MySQL慢查询日志之后,MySQL会自动将执行时间超过指定秒数的SQL统统记录下来,这对于搜罗线上慢SQL有很大的帮助。 SHOW VARIABLES LIKE 'slow%' 以我刚安装的mysql5.7为例 查询结果是这样子的:    slow_launch_time :表示如果建立线程花费了比这个值更长的时间,slow_launch_threads 计数器将增加    slow_query_log :是否开启慢查询日志 ON开启,OFF关闭 默认没有开启    slow_query_log_file :日志保存路径 SHOW VARIABLES LIKE 'long%'    long_query_time :达到多少秒的sql就记录日志 客户端可以用set设置变量的方式让慢查询开启,但是个人不推荐,因为真实操作起来会有一些问题,比如说,重启MySQL后就失效了,或者是开启了慢查询,我又去改变量值,它就不生效了。 编辑MySQL的配置文件: vim / etc / my . cnf 加入如下三行:    slow_query_log = ON   slow_query_log_file = /var/ lib / mysql / localhost - centos - slow . log   long_query_time = 3

MySQL进阶

匿名 (未验证) 提交于 2019-12-02 21:59:42
索引 1、概述 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。 建立索引会占用磁盘空间的索引文件。 2、索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null) 组合索引:多列值组成一个索引, 索引合并:使用多个单列索引组合查询搜索 覆盖索引:select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖 a、普通索引 普通索引仅有一个功能:加速查询 create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, index ix_name (name) ) 创建表+索引 create index index_name on table_name(column_name) 创建索引 drop index_name on table_name;

数据库标准-mysql

北战南征 提交于 2019-12-02 15:31:59
作者: 听风,原文地址: https://www.cnblogs.com/huchong/p/10219318.html 。JavaGuide 已获得作者授权。 数据库命令规范 数据库基本设计规范 1. 所有表必须使用 Innodb 存储引擎 2. 数据库和表的字符集统一使用 UTF8 3. 所有表和字段都需要添加注释 4. 尽量控制单表数据量的大小,建议控制在 500 万以内。 5. 谨慎使用 MySQL 分区表 6.尽量做到冷热数据分离,减小表的宽度 7. 禁止在表中建立预留字段 8. 禁止在数据库中存储图片,文件等大的二进制数据 9. 禁止在线上做数据库压力测试 10. 禁止从开发环境,测试环境直接连接生成环境数据库 数据库字段设计规范 1. 优先选择符合存储需要的最小的数据类型 2. 避免使用 TEXT,BLOB 数据类型,最常见的 TEXT 类型可以存储 64k 的数据 3. 避免使用 ENUM 类型 4. 尽可能把所有列定义为 NOT NULL 5. 使用 TIMESTAMP(4 个字节) 或 DATETIME 类型 (8 个字节) 存储时间 6. 同财务相关的金额类数据必须使用 decimal 类型 索引设计规范 1. 限制每张表上的索引数量,建议单张表索引不超过 5 个 2. 禁止给表中的每一列都建立单独的索引 3. 每个 Innodb 表必须有个主键 4.

Hive数据仓库你了解了吗

一世执手 提交于 2019-12-02 15:30:33
在工作中我们经常使用的数据库,数据库一般存放的我们系统中常用的数据,一般为百万级别。如果数据量庞大,达到千万级、亿级又需要对他们进行关联运算,该怎么办呢? 前面我们已经介绍了HDFS和MapReduce了,它俩结合起来能够进行各种运算,可是MapReduce的学习成本太高了,如果有一种工具可以直接使用sql将hdfs中的数据查出来,并自动编写mapreduce进行运算,这就需要使用到我们的hive数据仓库。 Hive基本概念 什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 为什么使用Hive 直接使用hadoop所面临的问题 人员学习成本太高 项目周期要求太短 MapReduce实现复杂查询逻辑开发难度太大 为什么要使用Hive 操作接口采用类SQL语句,提供快速开发的能力。 避免了去写MapReduce,减少开发人员的学习成本。 扩展功能很方便 Hive的特点 可扩展 Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。 延展性 Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。注意:这里说的函数可不是存储过程噢。 容错 良好的容错行,节点出现问题SQL仍可以完成执行 基本组成 用户接口:包括CLI、JDBC/ODBC、WebGUI 元数据存储:通常是存储在关系数据库如

Hive数据仓库你了解了吗

两盒软妹~` 提交于 2019-12-02 15:19:30
在工作中我们经常使用的数据库,数据库一般存放的我们系统中常用的数据,一般为百万级别。如果数据量庞大,达到千万级、亿级又需要对他们进行关联运算,该怎么办呢? 前面我们已经介绍了HDFS和MapReduce了,它俩结合起来能够进行各种运算,可是MapReduce的学习成本太高了,如果有一种工具可以直接使用sql将hdfs中的数据查出来,并自动编写mapreduce进行运算,这就需要使用到我们的hive数据仓库。 Hive基本概念 什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 为什么使用Hive 直接使用hadoop所面临的问题 人员学习成本太高 项目周期要求太短 MapReduce实现复杂查询逻辑开发难度太大 为什么要使用Hive 操作接口采用类SQL语句,提供快速开发的能力。 避免了去写MapReduce,减少开发人员的学习成本。 扩展功能很方便 Hive的特点 可扩展 Hive可以自由的扩展集群的规模,一般情况下不需要重启服务。 延展性 Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。注意:这里说的函数可不是存储过程噢。 容错 良好的容错行,节点出现问题SQL仍可以完成执行 基本组成 用户接口:包括CLI、JDBC/ODBC、WebGUI 元数据存储:通常是存储在关系数据库如

mysql创建使用存储过程

醉酒当歌 提交于 2019-12-02 14:48:53
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言 SQL 语句在执行的时候需要要先编译,然后执行,而存储过程( Stored Procedure )是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有 SQL 语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1). 存储过程增强了 SQL 语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2). 存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的 SQL 语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3). 存储过程能实现较快的执行速度。如果某一操作包含大量的 Transaction-SQL 代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化

实践中如何优化MySQL

寵の児 提交于 2019-12-02 14:45:12
实践中,MySQL的优化主要涉及SQL语句及索引的优化、数据表结构的优化、系统配置的优化和硬件的优化四个方面,如下图所示: (1)SQL语句优化: SQL语句的优化主要包括三个问题,即如何发现有问题的SQL、如何分析SQL的执行计划以及如何优化SQL,下面将逐一解释。 ① 怎么发现有问题的SQL?(通过MySQL慢查询日志对有效率问题的SQL进行监控) MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10s以上的语句。慢查询日志的相关参数如下所示: 通过MySQL的慢查询日志,我们可以查询出执行的次数多、占用的时间长的SQL,可以通过pt_query_disgest(一种mysql慢日志分析工具)分析Rows examine项(MySQL执行器需要检查的行数)去找出IO大的SQL以及发现未命中索引的SQL,对于这些SQL,都是我们优化的对象。 ② 通过explain查询和分析SQL的执行计划: 使用 EXPLAIN 关键字可以知道MySQL是如何处理你的SQL语句的,以便分析查询语句或是表结构的性能瓶颈。通过explain命令可以得到表的读取顺序、数据读取操作的操作类型、哪些索引可以使用

MySQL 性能优化总结

本小妞迷上赌 提交于 2019-12-02 10:53:54
一、影响mysql的性能因素 io: 磁盘IO、随机IO、网络IO 扫描行数 内存、临时表、key cache、query cache cpu:排序、分组查询、distinct查询 事务导致的表锁等 一条慢sql查询消耗的性能 > 1000条快查询消耗的性能。性能优化归根结底就是查询语句的优化,如何写出高效的查询语句呢? 对mysql的索引结构要有一定深度的了解,才能更好的写出高效的查询语句。 二、b+ tree结构索引的特点 b+tree 适应于全键值、键值范围或左前缀匹配查找 支持order by排序 b+ tree 索引不支持跳过索引中的列查找 三、hash结构索引特点 hash索引是基于hash表实现。 全值匹配、只有全键值精确匹配才可以查到,也就是说只有等值比较,如:=、in 不支持范围、部分匹配查找 不支持排序 当hash冲突较多的话,索引维护代价较高,查询性能也会受到影响。 四、聚簇索引的select,没有union和子查询 MySQL innodb存储引擎是基于聚簇索引构建而来,一般是基于主键id构建的b+tree索引和数据行而来, 如果表不存在主键,那么mysql会自动选择其他的非空的索引字段;如果非空索引字段不存在,而mysql内部会自动生成内部的唯一标识作为主键构建聚簇索引。 插入速度严重依赖于插入顺序。当主键不是数值自增长类型,而是varchar类型