mysql数据库有一个explain关键词,可以对select语句进行分析并且输出详细的select执行过程的详细信息。

对sql explain后输出几个字段:

  • id:SELECT查询的标识符,每个SELECT语句都会自动分配一个唯一的标识符

  • select_type:每个select查询字句的类型

    类型名 解释
    SIMPLE 简单SELECT,不使用UNION或子查询等
    PRIMARY 查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY
    UNION UNION中的第二个或后面的SELECT语句
    DEPENDENT UNION UNION中的第二个或后面的SELECT语句,取决于外面的查询
    UNION RESULT UNION的结果
    SUBQUERY 子查询中的第一个SELECT
    DEPENDENT SUBQUERY 子查询中的第一个SELECT,取决于外面的查询
    DERIVED 派生表的SELECT, FROM子句的子查询
    UNCACHEABLE SUBQUERY 一个子查询的结果不能被缓存,必须重新评估外链接的第一行
  • table:显示这一行的数据是查哪张表的,不过有时短路显示的不是真实的表名。

  • type:访问类型,表示MySQL在表中找到所需行的方式。type作为访问类型,其值代表着当前查询所用的类型,是体现性能的一个重要指标,从表中可以看到,从上到下,扫描表的方式越来越宽,性能也就越来越差,因此,对于一个查询,最好能保持在range级别以上。

    类型名 优级别 解释
    system 1 表仅有一行
    const 2 表最多有一个匹配行,在查询开始时即被读取
    eq_ref 3 使用primary key或者unique key作为多表连接的条件,仅从该表中读取一行
    ref 4 作为查询条件的索引在每个表匹配索引值的行从表中读取出来
    fulltext 5 全文索引检索
    ref_or_null 6 和ref一致,但增加了NULL值查询支持
    index_merge 7 表示使用了索引合并优化方法
    unique_subquery 8 使用了替换了in子查询
    index_subquery 9 使用了替换了in子查询,但只适用于子查询中的非唯一索引
    range 10 只检索给定范围的行,使用一个索引来选择行
    index 11 全表扫描,但扫描表的方式是按索引的次序进行
    ALL 12 全表扫描的方式找到匹配的行
  • possible_keys:主动指出查询能用哪个索引在表中找到记录
    也就是会列出在查询中的字段中有索引的字段,但不一定被查询所用。

  • key: 显示再查询中实际使用的索引/键,如果没有索引,则显示NULL。
    但如果想强制查询中使用或忽视possible_keys列中的索引,则可以在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

  • key_len:表示索引中使用的字节数。

  • ref:表示哪些列或常量被用于查找索引列上的值。

  • rows:显示当前查询估算到的查找到匹配记录所需的记录行数。

  • Extra:显示当前查询所用的解决方式。

    类型名 解释
    Using where 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,
    Using temporary 表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
    Using filesort MySQL中无法利用索引完成的排序操作称为“文件排序”
    Using join buffer 改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
    Impossible where 这个值强调了where语句会导致没有符合条件的行。
    Select tables optimized away 这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

explain常用于分析sql查询执行过程,以此便于分析。

基于mysql数据库 关于sql优化的一些问题的更多相关文章

  1. 基于Mysql数据库亿级数据下的分库分表方案

    移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据的用户行为分析等这样的分析,都需要依靠数据都统计和分析,当数据量小时,问题没有暴露出来,数据库方面的优化显得不太重要,一旦数据量越来越大时, ...

  2. MySQL性能调优与架构设计——第8章 MySQL数据库Query的优化

    第8章 MySQL数据库Query的优化 前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 ...

  3. (6)MySQL进阶篇SQL优化(MyISAM表锁)

    1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...

  4. Oracle,SQL Server 数据库较MySql数据库,Sql语句差异

    原文:Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 Oracle,SQL Server 数据库较MySql数据库,Sql语句差异 1.关系型数据库 百度百科 关系数据库 ...

  5. MySQL入门——MySQL数据库和SQL语言

    MySQL入门——MySQL数据库和SQL语言 摘要:本文主要了解了MySQL关系型数据库和SQL语言的基本知识. MySQL数据库 简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB ...

  6. 高并发大流量专题---10、MySQL数据库层的优化

    高并发大流量专题---10.MySQL数据库层的优化 一.总结 一句话总结: mysql先考虑做分布式缓存,过了缓存后就做mysql数据库层面的优化 1.mysql数据库层的优化的前面一层是什么? 数 ...

  7. 在Jena框架下基于MySQL数据库实现本体的存取操作

    在Jena框架下基于MySQL数据库实现本体的存取操作 转自:http://blog.csdn.net/jtz_mpp/article/details/6224311 最近在做一个基于本体的管理系统. ...

  8. mysql数据库-初始化sql建库建表-关联查询投影问题

    下面是一个简易商城的几张表的创建方式 drop database if exists shop ; create database shop CHARACTER SET 'utf8' COLLATE ...

  9. 1. 元信息:Meta类 2. 基于对象查询的sql优化 3. 自定义:Group_Concat() 4. ajax前后台交互

    一.元信息 ''' 1. 元信息 1. Model类可以通过元信息类设置索引和排序信息 2. 元信息是在Model类中定义一个Meta子类 class Meta: # 自定义表名 db_table = ...

随机推荐

  1. Spring Security 使用Ajax登陆无法跳转页面解决方法

    使用Security的朋友都知道,使用Security后,不再需要我们自己过多的(还需要写少量代码)写登陆的逻辑,只需要自己在html的登陆表单上面定义好输入框name为:username和passw ...

  2. Luogu P1542包裹快递【实数域二分】 By cellur925

    题目传送门 题目中说:最大值最小,显然是一个二分答案嘛qwq. 我们二分的答案显然是速度,但是由于实际中每一段的速度可能不同,所以这里我们把所有段进行的速度都定为二分出的答案. 二分的步骤好说,只是c ...

  3. Jmeter之一个请求获取上一个请求的参数

    刚开始有这个需求,网上都是一些使用正则表达式的例子,苦于自己看不好正式的表达式,且响应结果稍微变一下,自己就不会写了,于是谷歌上各种搜,也阅读官网上文档,后来发现一个好的插件 Json path Ex ...

  4. The Django Book学习笔记 06 admin

    自定义字段标签 自定义一个标签, 你只需在模块中指定 verbose_name=' ' from django.db import models # Create your models here. ...

  5. UVA - 1658 Admiral

    3. C - Admiral 题意:给定v(3<=v<=1000)个节点,e(3<=e<=10000)条边的又向加权图,求1->v的两条不相交的路径,使得权和最小. 思路 ...

  6. 动手实现 React-redux(二):结合 context 和 store

    既然要把 store 和 context 结合起来,我们就先构建 store.在 src/index.js 加入之前创建的 createStore 函数,并且构建一个 themeReducer 来生成 ...

  7. apt-get的一些坑

    apt-get update:更新安装列表apt-get upgrade:升级软件apt-get install software_name :安装软件apt-get --purge remove  ...

  8. 微信小程序 可用性一览

    1. 调试vConsole微信小程序通过vConsole的形式观察控制台打印.打印到vConsole控制台的是由 JSON 转化的字符串.这还是可以起到调试作用的. Source Map当es6 转  ...

  9. cordova应用使用手机调试

    对于cordova应用的调试,最方便调试方式还是作为h5应用在浏览器来调试,调试好了再打包cordova应用和打包apk.然而h5应用时的效果跟最终在安卓手机运行还有少数情况会不一样,因此,也需要有能 ...

  10. Android虚拟机电池状态设置

    问题描述: 安装SDK后使用AVD配合APPIUM进行测试,此时虚拟机的电池状态为0%充电中:部分APP会对手机电池状态有要求,不符合要求时,无法安装或打开. 解决思路: 1.Android系统设置( ...