草庐IT

MySql Explain字段解析

xysgo 2023-03-28 原文

MySql Explain字段解析

id

id列表示select的序号,查询Sql中有几个select就会有几个id。

id的值越大,该查询的优先级超高。

select_type

查询类型,Mysql的查询类型有:简单查询、复杂查询

  1. SIMPLE(简单查询)
  2. PRIMARY(复杂查询的最外层查询)
  3. SUBQUERY(复杂查询的子查询,出现在select或者where的子句中),
  4. DERIVED(复杂查询的FROM子句中的查询标记为DERIVED,MySql会将结果放在一个临时表中、也称为派生表)
  5. UNION(复杂查询中出现在UNION后面的查询标记为UNION)

table:

表示该查询的访问的是哪个表,可以是具体的表名,也可以是派生表 其中数字3表示该表是丛id为3的查询中派生出来的

partitions:

分区表会用上,使用极少,具体用法自行百度

type:

查询的类型,查询效率从高到低为

  1. NULL:表示在优化阶段就可以分解语句,此时在执行分段都不需要扫描表和索引,直接就可以拿到结果。如:查询主键id的最小值(select min(id) from table ),这里不需要扫描就可以从索引中直接拿到第一个id就是最小id
  2. system/const: 表示在优化阶段可以直接优化为常量,比如:select * from table where id =3 这个查询可以优化为 select 3 as id , name,... from table where id =3 ,这时id列的值其实已经确定了
  3. eq_ref:表示使用了唯一索引或者主键索引时,如:select * from table where id =1 ,因为id是主键索引,已经可以确定结果就只可能最多为一个数据。
  4. ref:表示使用了某个索引与一个具体的值比较,如:select * from table where name='tom' 这时不能确定结果的数量,但是这种查询可以扫描索引来得到结果,且结果在索引中一定是连续的
  5. rang:表示使用索引时是一个范围扫描,select * from table where id > 100 or id<5 ,这里就需要对索引进行范围扫描。
  6. index:索引扫描,直接扫描一个二级索引拿到结果,一般为覆盖索引查询。
  7. all:全表扫描

possible_keys:可能使用上的索引列,或者说可以使用上的索引

key:查询实际使用的索引列,当key中出现了一个索引,但是没有在possible_keys中出现,这可能是因为使用了聚簇索引

key_len:

使用索引长度,比如有个联合索引时,可能不会使用到联合索引的全部字段,只有上了前几个,这时就可以根据key_len字段来计算出到底使用了几个字段。

ref:

表示在查询中与key列索引作比较所使用的值是什么类型

  1. const: 表示使用的是常量
  2. table.id: 表示使用的是表的id字段

rows:

查询所需要读取数据的行数

filtered:

Mysql5.1加入,表示的是针对 表里符合某个条件的记录数百分比(悲观计算),如果你把rows列和这个百分比相乘,就可以大概计算出这个查询的结果行数

Extra:

额外信息

  1. using index : 表示使用了覆盖索引
  2. using where:表示储存引擎会把结果返回的Mysql查询服务器,然后使用where条件进行过滤
  3. using temporary: 表示对查询结果进行排序或者去重等操作时使用了临时表
  4. using filesort:表示对查询结果排序时使用了外部文件

有关MySql Explain字段解析的更多相关文章

  1. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 用逗号、双引号和编码解析 csv - 2

    我正在使用ruby​​1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  7. ruby-on-rails - 我更新了 ruby​​ gems,现在到处都收到解析树错误和弃用警告! - 2

    简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und

  8. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

  9. ruby-on-rails - Sphinx - 何时对字段使用 'has' 和 'indexes' - 2

    我几天前在我的ruby​​onrails2.3.2上安装了Sphinx和Thinking-Sphinx,基本搜索效果很好。这意味着,没有任何条件。现在,我想用一些条件过滤搜索。我有公告模型,索引如下所示:define_indexdoindexestitle,:as=>:title,:sortable=>trueindexesdescription,:as=>:description,:sortable=>trueend也许我错了,但我注意到只有当我将:sortable=>true语法添加到这些属性时,我才能将它们用作搜索条件。否则它找不到任何东西。现在,我还在使用acts_as_tag

  10. Ruby - 如何处理子类意外覆盖父类(super class)私有(private)字段的问题? - 2

    假设您编写了一个类Sup,我决定将其扩展为SubSup。我不仅需要了解你发布的接口(interface),还需要了解你的私有(private)字段。见证这次失败:classSupdefinitialize@privateField="fromsup"enddefgetXreturn@privateFieldendendclassSub问题是,解决这个问题的正确方法是什么?看起来子类应该能够使用它想要的任何字段而不会弄乱父类(superclass)。编辑:equivalentexampleinJava返回"fromSup",这也是它应该产生的答案。 最佳答案

随机推荐