精华内容
下载资源
问答
  • sql中提供了explain 关键字来分析查询性能,语法如下: explain SELECT * FROM tpi.cqca_userintegrationsummary where Id =313253。 重点关注字段 type 本次查询表联接类型,从这里可以看到本次...

    sql中提供了explain 关键字来分析查询性能,语法如下:

    explain SELECT * FROM tpi.cqca_userintegrationsummary where Id =313253。

    重点关注字段

    type

    本次查询表联接类型,从这里可以看到本次查询大概的效率

    key

    最终选择的索引,如果没有索引的话,本次查询效率通常很差

    key_len

    本次查询用于结果过滤的索引实际长度

    rows

    预计需要扫描的记录数,预计需要扫描的记录数越小越好

    Extra

    额外附加信息,主要确认是否出现 Using filesort、Using temporary 这两种情况

    explain关键字结果

    列名所代表的的含义:

    Id:   MySQL QueryOptimizer 选定的执行计划中查询的序列号。表示查询中执行select 子句或操作表的顺序,id 值越大优先级越高,越先被执行。id 相同,执行顺序由上至下。

    Select_type:

    • SIMPLE: 简单的 select 查询,不使用 union 及子查询

    • PRIMARY: 最外层的 select 查询

    • UNION: UNION 中的第二个或随后的 select 查询,不依赖于外部查询的结果集

    •  DERIVED: 用于 from 子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里。

    • UNION RESULT:UNION的结果

    • SUBQUERY:子查询中的第一个SELECT

    • DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

    •  DERIVED:导出表的SELECT(FROM子句的子查询)

    Table:输出查询中所引用的表

    Type:由上至下效率越来越低          

      各自的含义如下:

    1. NULL:MySQL不访问任何表或索引,直接返回结果
    2. system:  表仅有一行(=系统表)。这是 const 连接类型的一个特例。
    3. const:  const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System。
    4. eq_ref: 从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
    5. ref:  连接不能基于关键字选择单个行,可能查找 到多个符合条件的行。 叫做 ref 是因为索引要 跟某个参考值相比较。这个参考值或者是一个常数,或者是来自一个表里的多表查询的 结果值。
    6. ref_or_null:  如同 ref, 但是 MySQL 必须在初次查找的结果里找出 null 条目,然后进行二次查找。
    7. index_merge: 说明索引合并优化被使用了。
    8. unique_subquery:  在某些 IN 查询中使用此种类型,而不是常规的 ref:valueIN (SELECT primary_key FROM single_table WHERE some_expr)
    9. index_subquery:  在 某 些 IN 查 询 中 使 用 此 种 类 型 , 与unique_subquery 类似,但是查询的是非唯一 性索引
    10. range:  只检索给定范围的行,使用一个索引来选择 行。key列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可 以使用 range(一般该查询是最低忍受范围,一下两个就是慢的)。
    11. index:  全表扫描,只是扫描表的时候按照索引次序 进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。
    12. all: 最坏的情况,从头到尾全表扫描(出现了说明需要优化了)。

     possible_keys : 指出能在该表中使用哪些索引有助于 查询。如果为空,说明没有可用的索引。

     key:实际从 possible_key 选择使用的索引。 如果为 NULL,则没有使用索引。很少的情况 下,MYSQL 会选择优化不足的索引。这种情 况下,可以在 SELECT语句中使用 USE INDEX (indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制 MYSQL 忽略索引

     key_len:  使用的索引的长度。在不损失精确性的情况 下,长度越短越好。

     ref:  显示索引的哪一列被使用了 

    rows:   认为必须检查的用来返回请求数据的行数

     extra详细信息。

        Distinct:在select部分使用了distinc关键字。MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
        Using filesort:排序时无法使用到索引时,就会出现这个。
        Using temporary:表示使用了临时表存储中间结果。例如:ORDER BY或GROUP BY中的字段都来自左连接非驱动表(第二张表),就会创建一个临时表了

        Using index:索引覆盖。直接通过索引就可以获取查询的数据。
        Using where:需要回行。在查找使用索引的情况下,需要回表去查询所需的数据
        Using sort_union、Using union、Using intersect:这些函数说明如何为index_merge联接类型合并索引扫描。
        通过相乘EXPLAIN输出的rows列的所有值,可以粗略地知道MySQL必须检查多少行以执行查询。

    结论:

       1)出现了Using temporary,一般临时表排序,需要优化

        2)出现了Using filesort,排序时无法使用到索引时,就会出现这个

        3)rows过多,或者几乎是全表的记录数

        4)key 是 (NULL)

        5)possible_keys 出现过多(待选)索引

       

    展开全文
  • 刚才同事教了我1个SQL的命令。 执行Update Delete命令时,如果怕语句不正确。可以在前面加1个explain,就知道会影响多少条数据了。

    刚才同事教了我1个SQL的命令。


    执行Update Delete命令时,如果怕语句不正确。可以在前面加1个explain,就知道会影响多少条数据了。

     

    展开全文
  • Explain

    2019-12-20 16:37:31
    Explain工具介绍 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈 在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返 回执行计划的信息,而...

    Explain工具介绍
    使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈
    在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询会返
    回执行计划的信息,而不是执行这条SQL
    注意:如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中

    explain中的列
    接下来我们将展示 explain 中每个列的信息。
    1. id列
    id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
    id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。

    2. select_type列
    select_type 表示对应行是简单还是复杂的查询。
    1)simple:简单查询。查询不包含子查询和union
    mysql> explain select * from film where id = 2;

    2)primary:复杂查询中最外层的 select                                                                                                                                          3)subquery:包含在 select 中的子查询(不在 from 子句中)   

    4)derived:包含在 from 子句中的子查询。MySQL会将结果存放在一个临时表中,也称为派生表(derived的英文含义)

    explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der;    

                

    5)union:在 union 中的第二个和随后的 select 

    explain select 1 union all select 1;

    3. table列
    这一列表示 explain 的一行正在访问哪个表。
    当 from 子句中有子查询时,table列是 <derivenN> 格式,表示当前查询依赖 id=N 的查询,于是先执行 id=N 的查询。
    当有 union 时,UNION RESULT 的 table 列的值为<union1,2>,1和2表示参与 union 的select 行id。 

    4. type列
    这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行记录的大概范围。
    依次从最优到最差分别为:system > const > eq_ref > ref > range > index > ALL
    一般来说,得保证查询达到range级别,最好达到ref
    NULL:mysql能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如:在索引列中选取最小值,可以单独查找索引来完成,不需要在执行时访问表

     explain select min(id) from film;

    5. possible_keys列
    这一列显示查询可能使用哪些索引来查找。
    explain 时可能出现 possible_keys 有列,而 key 显示 NULL 的情况,这种情况是因为表中数据不多,mysql认为索引对此查询帮助不大,选择了全表查询。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查 where 子句看是否可以创造一个适当的索引来提高查询性能,然后用 explain 查看效果。 

    6. key列
    这一列显示mysql实际采用哪个索引来优化对该表的访问。
    如果没有使用索引,则该列是 NULL。如果想强制mysql使用或忽视possible_keys列中的索引,在查询中使用 force index、ignore index。

    7. key_len列
    这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。
    8. ref列
    这一列显示了在key列记录的索引中,表查找值所用到的列或常量,常见的有:const(常量),字段名(例:film.id)

    9. rows列
    这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数。

    10. Extra列
    这一列展示的是额外信息。常见的重要值如下:

    1)Using index:使用覆盖索引

    2)Using where:使用 where 语句来处理结果,查询的列未被索引覆盖

    3)Using index condition:查询的列不完全被索引覆盖,where条件中是一个前导列的范围

    4)Using temporary:mysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。

    5)Using filesort:将用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。这种情况下一般也是要考虑使用索引来优化的。

    6)Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段

    索引最佳实践

    CREATE TABLE `employees` (
     `id` INT(11) NOT NULL AUTO_INCREMENT,
     `name` VARCHAR(24) NOT NULL DEFAULT '' COMMENT '姓名',
     `age` INT(11) NOT NULL DEFAULT '0' COMMENT '年龄',
     `position` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '职位',
     `hire_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间',
     PRIMARY KEY (`id`),
     KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE
     ) ENGINE=INNODB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='员工记录表';
     INSERT INTO employees(NAME,age,POSITION,hire_time) VALUES('LiLei',22,'manager',NOW());
     INSERT INTO employees(NAME,age,POSITION,hire_time) VALUES('HanMeimei',23,'dev',NOW());
     INSERT INTO employees(NAME,age,POSITION,hire_time) VALUES('Lucy',23,'dev',NOW());

     

    1.全值匹配

    EXPLAIN SELECT * FROM employees WHERE name= 'LiLei';

    EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22;

    EXPLAIN SELECT * FROM employees WHERE NAME= 'LiLei' AND age = 22 AND POSITION ='manager';
    -- 交换顺序一样,mysql内部会做优化调整查询条件顺序,前提是必须有前导列
    EXPLAIN SELECT * FROM employees WHERE age = 22 AND NAME= 'LiLei'  AND POSITION ='manager';

     

    2.最左前缀

    如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

    EXPLAIN SELECT * FROM employees WHERE age = 22 AND position ='manager';
    EXPLAIN SELECT * FROM employees WHERE position = 'manager';
    EXPLAIN SELECT * FROM employees WHERE name = 'LiLei';

    3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描 

    EXPLAIN SELECT * FROM employees WHERE name = 'LiLei';
    EXPLAIN SELECT * FROM employees WHERE left(name,3) = 'LiLei';

    4.存储引擎不能使用索引中范围条件右边的列 

    -- 将不会使用POSITION索引,只有前两个索引生效
    EXPLAIN SELECT * FROM employees WHERE NAME= 'LiLei' AND age > 22 AND POSITION ='manager';

    5.尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少select *语句 

    6.mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描

    7.is null,is not null 也无法使用索引

    8.like以通配符开头('%abc...')mysql索引失效会变成全表扫描操作

    9.字符串不加单引号索引失效

    10.少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引

    11.范围查询优化(拆分查询范围)

    展开全文
  • Below is my query to get 20 rows with genre_id 1.EXPLAIN SELECT * FROM (`content`)WHERE `genre_id` = '1'AND `category` = 1LIMIT 20I have total 654 rows in content table with genre_id 1, I have index o...

    Below is my query to get 20 rows with genre_id 1.

    EXPLAIN SELECT * FROM (`content`)

    WHERE `genre_id` = '1'

    AND `category` = 1

    LIMIT 20

    I have total 654 rows in content table with genre_id 1, I have index on genre_id and in above query I am limiting result to display only 20 records which is working fine but explain is showing 654 records under rows, I tried to add index on category but still same result and then also I removed AND category = 1 but same rows count:

    id select_type table type possible_keys key key_len ref rows Extra

    1 SIMPLE content ref genre_id genre_id 4 const 654 Using where

    HERE I found the answer

    LIMIT is not taken into account while estimating number of rows Even

    if you have LIMIT which restricts how many rows will be examined MySQL

    will still print full number

    But also In comments another reply was posted:

    LIMIT is now taken into account when estimating number of rows. I’m

    not sure which version addressed this, but in 5.1.30, EXPLAIN

    accurately takes LIMIT into account.

    I am using MySQL 5.5.16 with InnoDB. so as per above comment its still not taking into account. So my question is does mysql go through all 654 rows to return 20 rows even I have set limit? Thanks

    解决方案Does mysql LIMIT is taken into account when estimating number of rows in Explain?

    No. (5.7 with JSON may be a different matter.)

    展开全文
  • explain

    2020-08-07 14:44:18
    explain explain 的作用是分析查询语句。它的字段有: id:标识符 select_type:查询的类型(simple) table:输出结果集的表 partitions:匹配的分区 type:表的连接类型。从好到坏的顺序是:(const > eq_ref ...
  • mysql 执行计划explain详解

    千次阅读 2017-03-28 01:34:59
    explain主要是用来获取一个query的执行计划,描述mysql如何执行查询操作、执行顺序,使用到的索引,以及mysql成功返回结果集需要执行的行数。可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进...
  • MySQL的explain命令详解

    2016-10-30 01:39:02
    使用 explain 命令可以分析出SQL查询语句中索引的使用情况、扫描的行数、扫描的类型等等,以便帮助我们对索引和SQL语句进行优化。使用方法:在SQL查询语句前面,加上 explain 或 desc 即可。为了便于
  • EXPLAIN

    2018-03-27 11:37:35
    在sql前加上这个标志,可以查看具体信息,用到的索引,查询的行数
  • explain详解

    千次阅读 2020-08-24 22:17:30
    使用explain可以模拟优化器执行sql语句,分析查询语句的结构,是否使用索引等等 使用方法: 在查询语句select关键字前面加上explain关键字,如下图的格式,然后就会返回分析的结果 下面来详解使用explain后返回的...
  • 文章目录explain语法三大连接嵌套连接哈希连接合并连接explain成本计算explain行数评估从bucket评估行数从MCV(most common values)评估行数从MCV和distinct值中评估行数从MCV和bucket中评估行数多个列查询条件的选择...
  • PostgreSQL EXPLAIN

    2021-01-25 20:31:27
    你可以使用EXPLAIN命令察看规划器为每个查询生成的查询规划是什么。 PostgreSQL 9.5.3 中文手册 —— 14.1. 使用EXPLAIN 1. 使用EXPLAIN 例如查询库存移动SQL: test=# EXPLAIN SELECT * FROM stock_move;
  • MySQL EXPLAIN详解

    2021-01-04 23:29:29
    MySQL EXPLAIN详解1. EXPLAIN详解1.1 EXPLAIN使用1.2 参数解读1.2.1 id 唯一标识1.2.2 select_type 查询类型...len 索引的长度1.2.9 ref 索引引用列1.2.10 rows 扫描的行数1.2.11 filtered 符合查询条件的数据百分比1.
  • Explain详解

    千次阅读 2020-02-01 16:05:56
    二、explain 的两种使用方式 三、explain中的列 1. id列 2. select_type列 3. table列 4. type列 5. possible_keys列 6. key列 7. key_len列 8. ref列 9. rows列 10. Extra列 四、索引最佳实践 使用...
  • explain语句

    2019-11-15 20:26:40
    explain(解释)语句 使用explain关键字可以模拟优化器执行sql查询语句,从而知道mysql是如何处理你的sql语句的,这可以帮你分析你的查询语句或是表结构的性能瓶颈,通过explain命令可以得到: 1.表的读取顺序 2.数据读取...
  • 快速获取mysql行数

    千次阅读 2019-02-20 12:00:26
    explain select * from table; //返回数组,rows 。表示数据库引擎保存的估计的行数
  • mysql explain

    千次阅读 2018-11-28 17:55:26
    电脑系统 ... explain之二:Explain 结果解读与实践,分析诊断工具之二 MySQL优化—工欲善其事,必先利其器之EXPLAIN   执行计划:  方法 两种方法都行:下面例子使用第一种;  1、在sq...
  • 本文是关于在学习《高性能 Mysql》附录 D 中关于 Explain 如何获取执行计划信息相关总结。...在 SELECT 语句前加上 Explain 就可以查看到相关信息, 例如:EXPLAIN Explain 特点explain 返回的结果是以...
  • MySQL 之 Explain 输出分析背景前面的文章写过 MySQL 的事务和锁,这篇文章我们来聊聊 MySQL 的 Explain,估计大家在工作或者面试中多多少少都会接触过这个。可能工作中实际使用的不多,但是不论的自己学习还是面试...
  • Mariadb EXPLAIN

    2018-10-02 11:05:41
    MariadDB 查询中可以使用SELECT的前面使用EXPLAIN来查看索引的使用情况,接下来,我们来描述一下,explain所产生的一些信息。 EXPLAIN SELECT clause; 获取查询执行计划信息,用来查看查询优化器如何执行查询 ...
  • Explain语法

    2017-01-10 22:56:44
    EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2. EXPLAIN PARTITIONS SELECT …… 用于分区表的...
  • EXPLAIN讲解

    2020-01-29 16:38:54
    EXPLAIN 说明 EXPLAIN select * from `lenyar_bate`.`tbl_user_info` order by school_id 2.属性说明 1.id id相同时为同一组,顺序从上到下,id越大优先级越高 2.select_type 查询的类型 2.1...
  • mysql explain分析

    2018-01-29 10:58:18
    在做mysql性能优化的时候,通常会对其执行计划进行分析。这个时候就用到了explain命令。 先来看一下explain命令使用后的效果: ...通过rows关键字可以看出受影响行数。key关键字为索引名称,没有加索引或索引未

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,900
精华内容 10,360
关键字:

explain行数