mysql执行计划

MySQL执行计划extra中的using index 和 using where using index 的区别

喜夏-厌秋 提交于 2020-03-18 18:52:53
本文出处: http://www.cnblogs.com/wy123/p/7366486.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) mysql执行计划中的extra列中表明了执行计划的每一步中的实现细节,其中包含了与索引相关的一些细节信息 其中跟索引有关的using index 在不同的情况下会出现Using index, Using where Using index ,Using index condition等 那么Using index 和 Using where;Using index 有什么区别?网上搜了一大把文章,说实在话也没怎么弄懂,于是就自己动手试试。 本文仅从最简单的单表去测试using index 和 using where using index以及简单测试using index condition的情况的出现时机 。 执行计划的生成与表结构,表数据量,索引结构,统计信息等等上下文等多种环境有关,无法一概而论,复杂情况另论。 测试环境搭建   测试表以及测试数据搭建,类似于订单表和订单明细表,暂时先用订单表做测试   测试表结构 create table test_order ( id int auto_increment primary key, user_id

MySQL filesort优化案例一则

佐手、 提交于 2020-03-18 18:44:48
今天遇到一个filesort优化的案例,感觉不错,分享出来。 MySQL中filesort是什么意思?官方手册定义: MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause . The keys then are sorted and the rows are retrieved in sorted order。 一般来说如果有你的SQL查询语句中有order by且没有合适的索引时,通过EXPLAIN query可以在Extra列查看到Using filesort字样,当然一般来说此时也代表你需要去优化它了,无论是通过优化索引还是改变SQL查询实现方式。 先看表结构信息: CREATE TABLE `tbxxxx` ( `id` int(10) unsigned NOT NULL auto_increment COMMENT '??id', `a`

深入理解MySQL索引

做~自己de王妃 提交于 2020-03-18 13:26:59
前言 当提到MySQL数据库的时候,我们的脑海里会想起几个关键字:索引、事务、数据库锁等等,索引是MySQL的灵魂,是平时进行查询时的利器,也是面试中的重中之重。 可能你了解索引的底层是b+树,会加快查询,也会在表中建立索引,但这是远远不够的,这里列举几个索引常见的面试题: 1、索引为什么要用b+树这种数据结构? 2、聚集索引和非聚集索引的区别? 3、索引什么时候会失效,最左匹配原则是什么? 当遇到这些问题的时候,可能会发现自己对索引还是一知半解,今天我们一起学习MySQL的索引。 一、一条查询语句是如何执行的 首先来看在MySQL数据库中,一条查询语句是如何执行的,索引出现在哪个环节,起到了什么作用。 1.1 应用程序发现SQL到服务端 当执行SQL语句时,应用程序会连接到相应的数据库服务器,然后服务器对SQL进行处理。 1.2 查询缓存 接着数据库服务器会先去查询是否有该SQL语句的缓存,key是查询的语句,value是查询的结果。如果你的查询能够直接命中,就会直接从缓存中拿出value来返回客户端。 注:查询不会被解析、不会生成执行计划、不会被执行。 1.3 查询优化处理,生成执行计划 如果没有命中缓存,则开始第三步。 解析SQL:生成解析树,验证关键字如select,where,left join 等)是否正确。 预处理:进一步检查解析树是否合法,如检查数据表和列是否存在

程序员看了都要收藏系列:Mysql进阶知识干货笔记!

房东的猫 提交于 2020-03-17 22:54:17
一、SQL执行顺序以及常见SQL的join查询 sql执行顺序 : 手写 SELECT DISTINCT <select_list> FROM <left table> <join type> JOIN <right_table> ON <join_codition> WHERE <where_condition> HAVING <having_condition> ORDER BY < order_by_condition> LIMIT < limit number> 机读顺序 1 FROM <left_table> 2 ON <join_condition> 3 <join_type> JOIN <right_table> 4 WHERE <where_condition> 5 GROUP BY <group by_list> 6 HAVING <having_condition> 7 SELECT 8 DISTINCT <select_list> 9 ORDER BY <order_by_condition> 10 LIMIT <limit_number> sql机器执行顺序 七种join关系 二、索引 1、什么是索引 索引是帮助MYSQL高效获取数据的数据结构-->排好序的快速查找数据结构 我们平时所说的索引,没有特别指明,都是指B树(多路搜索树,不一定是二叉)

MySQL 查询优化

99封情书 提交于 2020-03-14 09:41:14
1、MySQL 查询统计数据表行数三种方式:select count(*) 、select count(1) 、select count(具体字段),三者查询效率是怎么样的呢? 解答: 在MySQL InnoDB 存储引擎中,count(*) 和count(*) 都是对所有结果进行count。如果有where 子句,则是对所有筛选条件的数据行进行统计;如果没有where子句,则是对数据表的数据行数进行统计。 因此count(*) 和 count(1) 本质上并没有区别,执行的复杂度都是O(N),也就是采用全表扫描,进行循环+计数的方式进行统计。 如果是MySQL MyISAM 存储引擎,统计数据表的行数只需要O(1)的复杂度,这是因为每张MyISAM的数据表都有一个meta信息存储了row_count值,而一致性则由表级锁来保证,因为InnoDB支持事务,采用行级锁和MVCC机制,所以无法像MyISAM一样,只维护一个row_count变量,因此采用扫描全表,进行循环+计数的方式来完成统计; 在执行过程中,count(*) 和 count(1)执行时间略有差别,不过效率可以基本看成是相等的。 一般情况,三者的执行效率count(1) = count(*) >count(字段)。我们尽量使用count(*),当然如果你知道你要统计的是某个字段的非空数据行数,则另当别论

SQL Server,MySQL,Oracle三者的区别

僤鯓⒐⒋嵵緔 提交于 2020-03-13 07:28:39
SQL Server,MySQL,Oracle三者的区别 Oracle Oracle 能在所有主流平台上运行(包括Windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持,Oracle并行服务器通过使一组结点共享同一簇中的工作来扩展Windows NT的能力,提供高可用性和高伸缩性的簇的解决方案。如果Windows NT不能满足需要,用户可以把数据库移到UNIX中。Oracle的并行服务器对各种UNIX平台的集群机制都有着相当高的集成度。Oracle获得最高认证级别的ISO标准认证.Oracle性能最高,保持开放平台下的TPC-D和TPC-C的世界记录Oracle多层次网络计 算,支持多种工业标准,可以用ODBC、JDBC、OCI等网络客户连接。 Oracle 在兼容性、可移植性、可联结性、高生产率上、开放性也存在优点。Oracle产品采用标准SQL,并经过美国国家标准技术所(NIST)测试。与 IBM SQL/DS,DB2,INGRES,IDMS/R等兼容。 Oracle的产品可运行于很宽范围的硬件与操作系统平台上。可以安装在70种以上 不同的大、中、小型机上;可在VMS、DOS、UNIX、WINDOWS等多种操作系统下工作。能与多种通讯网络相连,支持各种协议(TCP/IP、 DECnet、LU6.2等)。提供了多种开发工具

笔记:MySQL相关知识

孤街醉人 提交于 2020-03-12 09:03:48
MySQL背景介绍 MySQL发展史 MySQL分支介绍 MySQL的优点 MySQL数据库组成 MySQL的原理 MySQL执行流程 MySQL日志 MySQL事务、锁、索引与SQL优化 MySQL背景介绍 随着互联网企业的兴起,例如阿里巴巴、网易、Yahoo、Facebook等大型互联网公司的推动,目前Mysql已经成为世界上最流行的数据库,并一步步开始占领了原有商业数据库的市场,目前Mysql已经成为互联网公司甚至部分传统公司的首选数据库。 MySQL发展史 最初为AB公司的产品,Mysql5.0及之前的版本均由AB公司管理,在2008年的时候AB公司被Sun公司收购,Mysql也就归属到了Sun公司下,但在Sun还没待多久,Sun公司就被Oracle公司收购了,此期间诞生了一个Sun向Oracle的过渡版本:Mysql5.5(5.1-5.5之间没有发布过版本),直至5.6Mysql就彻底归属于Oracle公司旗下了,从Oracle收购Mysql以来,Mysql发展的速度及新的功能越来越强大,逐步向Oracle靠拢,如:表空间、redo、undo分离、隐藏索引,至2019年,Mysql8.0.15已经GA(官方发布稳定版本),整体发展过程如下(AB版本不做加入): 5.1 → 5.5 → 5.6 → 5.7 → 8.0 MySQL分支介绍 MySQL 是一个开源数据库

mysql 学习笔记 01

孤街醉人 提交于 2020-03-11 23:29:43
知识大纲 客户端查询请求流程 先来看客户端运行一条查询 sql 会经过哪些流程: mysql 基本组成结构 从上面的图中可以看出,mysql 大致由 server 层 和 存储引擎层组成。 为了管理方便,mysql 把连接管理、查询缓存、语法解析、查询优化这些并不涉及真实数据存储的功能划分为 server 层的功能,把真实存取数据的功能划分为存储引擎的功能。 下面详细说明下各个模块的功能: 一、server server 层又分别由 连接器、查询缓存、分析器、优化器、执行器组成。 1.1 连接器 mysql 是 C/S 架构,每当有一个客户端连接到服务器时,服务器都会创建一个线程来专门处理与这个客户端的交互。 客户端和服务端的连接方式总共有三种。 TCP/IP 命名管道和共享内存(Windows 系统, 客户端和服务端 必须在同一台机器) Unix 域套接字文件(类Unix 系统,客户端和服务端 必须在同一台机器) 注意: 如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。 也就是说即使管理员在此时修改了用户的数据库权限,只有用户重新建立连接才会生效。 当客户端与服务端建立连接后,客户端就会以文本消息的方式与服务端通信(CRUD)。服务端接收到消息后(比如一个查询请求),还要进行一系列处理,才能返回数据给客户端

SQL注入详解

↘锁芯ラ 提交于 2020-03-11 17:02:08
今天跟大家分享SQL注入的知识。 前言 先来看一副很有意思的漫画: 相信大家对于学校们糟糕的网络环境和运维手段都早有体会,在此就不多做吐槽了。今天我们来聊一聊SQL注入相关的内容。 1 何谓SQL注入? SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。 SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。 这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。 多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。 SQL数据库操作示例: import sqlite3 连接数据库: conn = sqlite3 . connect ( 'test.db' ) 建立新的数据表: conn . executescript ( '' 'DROP TABLE IF EXISTS students ; CREATE TABLE

【mysql】使用Explain性能分析

人盡茶涼 提交于 2020-03-11 10:53:24
SQL查询瓶颈 CPU (SQL中对大量数据进行比较、关联、排序、分组,最大的压力在于比较) IO (服务器内存不能满足缓存数据,需要进行多次物理IO) 锁 (不适宜锁的设置导致线程阻塞,尤其是线程交叉查询,导致死锁) 服务器自身性能 (top,free, iostat和vmstat来查看系统的性能状态) Explain 使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析查询语句或是表结构的性能瓶颈。简单来说就是查看我们的SQL执行计划 主要作用有: 表的顺序读取 哪些索引可以使用 数据读取操作的操作类型 哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询 执行器主要包含的信息: 说明 id select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 1、id相同,从上往下执行 2、id不同,子查询的id值+1,id值越大优先级越高越先被执行 select_type 查询的类型,主要区别普通查询,联合查询,子查询等复杂查询 1、SIMPLE ,简单的 select 查询,查询中不包含子查询或者UNION 2、PRIMARY, 3、DERIVED 4、SUBQUERY 5、DEPENDENT SUBQUERY 6、UNCACHEABLE SUBQUREY 7、UNION 8、UNION