mysql执行计划

MYSQL中in or union的效率问题

瘦欲@ 提交于 2019-12-03 02:35:44
今天有人问in一堆条件的sql如何优化。这个很自然就想到用union来代替in来提高效率,网上很多例子也是这么说的 http://blog.csdn.net/adparking/article/details/6678911 http://hi.baidu.com/dereky/blog/item/382c2df536c0532cbc310929.html http://www.cnblogs.com/xwblog/archive/2012/04/09/2438737.html 可是我在本机做实验为什么有相反地结果呢... EXPLAIN SELECT * from employees where employees.first_NAME ='Georgi' UNION ALL SELECT * from employees where employees.first_NAME ='Bezalel' 这条语句执行结果481条,执行时间为0.35s 1 PRIMARY employees ALL 300141 Using where 2 UNION employees ALL 300141 Using where UNION RESULT <union1,2> ALL explain SELECT * FROM employees WHERE employees.first_name

MySQL面试题

不想你离开。 提交于 2019-12-03 01:47:04
1、MySQL的复制原理以及流程 (1)、复制基本原理流程 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 3. 从:sql执行线程——执行relay log中的语句; (2)、MySQL复制的线程有几个及之间的关联 MySQL 的复制是基于如下 3 个线程的交互( 多线程复制里面应该是 4 类线程): 1. Master 上面的 binlog dump 线程,该线程负责将 master 的 binlog event 传到slave; 2. Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入 relay log; 3. Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行; 4. 如果是多线程复制,无论是 5.6 库级别的假多线程还是 MariaDB 或者 5.7 的真正的多线程复制, SQL 线程只做 coordinator,只负责把 relay log 中的 binlog读出来然后交给 worker 线程, woker 线程负责具体 binlog event 的执行; (3)

MySQL常见问题

巧了我就是萌 提交于 2019-12-03 01:46:33
事务四大特性 原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态 一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的; 隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。 持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。 MySQL的事务隔离级别 未提交读(Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。 可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞 MySQL数据库(InnoDB引擎)默认使用可重复读( Repeatable read) 索引 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B_TREE。B

MySQL 军规

早过忘川 提交于 2019-12-02 23:29:13
MySQL 基础篇 三范式 MySQL 军规 MySQL 配置 MySQL 用户管理和权限设置 MySQL 常用函数介绍 MySQL 字段类型介绍 MySQL 多列排序 MySQL 行转列 列转行 MySQL NULL 使用带来的坑 MySQL AND 和 OR 联合使用带来的坑 MySQL 触发器的使用 转载: 《58到家数据库30条军规解读》 《赶集mysql军规》 《58到家MySQL军规升级版》 基础规范 必须使用 InnoDB 存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高。 表字符集默认使用 utf8 ,必要时候使用 utf8mb4 解读:万国码,无需转码,无乱码风险,节省空间,utf8mb4 是 utf8 的超集,有存储4字节例如表情符号时,使用它。 数据表、数据字段必须加入中文注释 禁止使用存储过程、视图、触发器、Event 解读:高并发大数据的互联网业务,架构设计思路是“解放数据库 CPU,将计算转移到服务层”,并发量大的情况下,这些功能很可能将数据库拖死,业务逻辑放到服务层具备更好的扩展性,能够轻易实现“增机器就加性能”。数据库擅长存储与索引,CPU 计算还是上移吧。 禁止存储大文件或者大照片 解读:为何要让数据库做它不擅长的事情?大文件和照片存储在文件系统,数据库里存 URI 多好。 控制单表数据量

MySQL锁机制

£可爱£侵袭症+ 提交于 2019-12-02 23:08:38
一、基本概念   从操作的类型上来看,分为读锁和写锁:     读锁:共享锁,对同一份数据,多个读操作可以同时进行且相互间不影响     写锁:排它锁,独占资源。在当前操作未完成之前,其他写操作必须等待。读操作不影响。        排它锁作用于innodb,且必须在事务块中执行。在进行事务操作时,for update会对结果集中的每一行数据加排它锁,其他线程对于结果集中的数据进行修改操作,全部阻塞。   从锁数据的细粒度上来看,分为行锁和表锁。 二、测试   测试环境:mysql 5.5.6、Navicat for mysql。   新建表: CREATE TABLE `tb_user` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(10) DEFAULT NULL, `password` varchar(10) DEFAULT NULL, `sex` char(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;   开启两个查询会话,模拟多请求。   1、表锁     锁的粒度偏大,开销小,锁表快,但是发生锁竞争的概率特别高,并发度低。     对于更新update、delete

MySQL问题排查工具介绍

匿名 (未验证) 提交于 2019-12-02 22:06:11
http://mrchenatu.com/2017/03/24/mysql-tool/ 本总结来自美团内部分享,屏蔽了内部数据与工具 知识准备 索引 索引是存储引擎用于快速找到记录的一种数据结构 B-Tree,适用于全键值,键值范围或键最左前缀:(A,B,C): A, AB, ABC,B,C,BC 哪些列建议创建索引:WHERE, JOIN , GROUP BY, ORDER BY等语句使用的列 如何选择索引列的顺序: 经常被使用到的列优先 选择性高的列优先:选择性=distinct(col)/count(col) 宽度小的列优先:宽度 = 列的数据类型 慢查询 原因 未使用索引 索引不优 服务器配置不佳 死锁 … 命令 看版本 mysql -V 客户端版本 select version 服务器版本 explain 执行计划,慢查询分析神器 type const,system: 最多匹配一个行,使用主键或者unique进行索引 eq_ref: 返回一行数据,通常在联接时出现,使用主键或者unique索引(内表索引连接类型) ref: 使用key的最左前缀,且key不是主键或unique键 range: 索引范围扫描,对索引的扫面开始于某一点,返回匹配的行 index:以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描 all: 全表扫描 no no no extra

MySQL数据优化总结-查询备忘录

匿名 (未验证) 提交于 2019-12-02 22:06:11
一、优化分类 二、测试数据样例 参考mysql官方的sakina数据库。 三、使用mysql慢查询日志对有效率问题的sql进行监控 第一个,开启慢查询日志。第二个,慢查询日志存储位置。第三个,没有使用索引的也会记录到慢查询日志中。第四个,超过1秒之后的查询记录到慢查询日志中(通常设置100ms)。 3.1、分析慢查询日志文件 3.1.1 tail命令 tail -50 /home/mysql/sql_log/mysql_slow.log,输入文件中的尾部内容,即末尾50行数据. 我们抽出其中一条,查看,如下图所示。 query_time,查询耗时(单位秒);lock_time,锁表时间。rows_sent,发送请求的行数;rows_examined,查询数据导致扫描表用到的行数。 3.1.2 官方mysqldumpslow工具 mysqldumpslow ,默认随mysql安装。 mysqldumpslow -h,可查询工具支持的命令。 mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log | more ,返回结果如下图所示。 3.1.3 pt-query-digest工具 比mysqldumpslow反馈的信息多。 pg-query-digest --help 查看帮助,查看使用命令。 pg-query-digest

MySQL之事务、锁

匿名 (未验证) 提交于 2019-12-02 22:06:11
锁 一、概念   锁是计算机协调多个进程或线程访问某一个资源的机制。在数据库中,除传统的计算资源(CPU、RAM、IO)的争用意外,数据也是一种许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问的一个重要因素。从这个角度来说,锁对数据库尤其重要,也更加复杂。本文就以MyISAM和InnoDB两个引擎来说明锁的问题; 二、MySQL锁概述   相对其他数据库而言,MySQL的锁机制比较简单,其中最为显著的特点是不同的引擎具有不同的锁。比如MyISAM和InnoDB分别采用表锁、行锁,但是InnoDB也支持表锁,默认情况下采用行锁; 三、MySQL表锁和行锁对比 锁的名称 开销 加锁速度 死锁 粒度 并发性能 表锁 С 快 不会出现 大 最低 行锁 大 慢 出现 С 最高 从锁的角度来说表锁适合查询为主,只有少量按索引条件更新数据的应用;行锁适合于大量按索引条件来并发更新少量的数据,同时又有并发查询的应用; MyISAM表锁   可以通过table_locks_waited和table_locks_immediate来分析系统表锁的争夺; 如果table_locks_waited的值比较高的话,则说明存在较高的表锁争夺。 二、表锁的锁模式   表级锁有两种方式:读锁和写锁,锁模式的兼容性如下: 由上表可见

Mysql存储过程

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

MySQL - 引擎、Explain、权限详解

匿名 (未验证) 提交于 2019-12-02 22:06:11
一、引擎 简介 Innodb引擎 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。 MyIASM引擎 MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。 主要区别 1、MyIASM是非事务安全的