如何使用索引查询?如何使用索引查询数据?
深夜,最近在写一些关于SQL优化的文章。我看到在私聊中,很多人都在问如何判断是否需要优化,或者如何检查MySQL的执行计划。本文简要介绍了MySQL EXPLAIN命令。
EXPLAIN命令是查看优化器如何决定执行查询的主要方法。通常,我们会检查执行计划中的以下信息:
SQL如何使用索引
连接查询的执行顺序
扫描的数据行数
可以使用哪些索引?
实际使用了哪些索引?
MySQL解释语法
如下
执行计划中包含的信息
ID描述
指示SELECT语句的执行顺序。ID相同时,执行顺序是从上到下。如果是子查询,ID的序列号会增加。ID越大,优先级越高,执行的优先级也越高。
SELECT_TYPE描述
简单:简单查询,即不包含子查询或联合操作的查询。
PRIMARY:最外层的查询,也就是说,如果查询包含任何子查询,则最外层的查询被标记为PRIMARY。
子查询:映射为子查询,即子查询包含在SELECT或WHERE列表中。
从属子查询:依赖于外部结果的子查询。
派生的:子查询,即出现在FROM子句中的子查询。
UNION: UNION,如果第二个选择出现在UNION之后,则标记为UNION。如果UNION包含在FROM子句的子查询中,外部SELECT将被标记为DERIVED。
union RESULT:使用UNION的结果,即UNION产生的结果集。
表格描述
指当前正在执行的表,即输出数据行所在的表的名称。ID为M,N的查询联合产生的结果集,或ID为N的查询产生的结果.
类型描述
ALL:扫描整个数据表,遍历整个表来查找匹配的行,效率最低。
索引:全索引表扫描。index和ALL的区别在于,索引类型只遍历索引树。
范围:搜索索引列的范围,仅检索给定范围内的行,并使用索引来选择行。这在诸如BETWEEN、and等查询条件中很常见。当MySQL使用索引查找一系列值时,比如in和OR,也会显示范围。
INDEX_MERGE:合并索引并使用多个单列索引进行搜索。
REF:使用非唯一索引扫描或唯一索引的前缀扫描来返回匹配单个值的数据行。但是,它可能会找到多个符合条件的行,因此它应该是搜索和扫描的混合。
EQ_REF:唯一索引扫描。对于每个索引键,表中只有一条数据与之匹配。常见于主键或唯一索引扫描。
CONST:当表中只有一个匹配行时使用。因为只有一行,所以这一行中的列值可以被优化器的其余部分视为常量,比如主键或唯一索引的查询,这是最高效的连接方法。
SYSTEM:SYSTEM是CONST类型的特例,即当查询的表只有一行时(等于SYSTEM表)。
NULL: MySQL在优化过程中分解语句,执行时甚至不需要访问表或索引。例如,从索引列中选择最小值可以通过搜索单独的索引来完成。
表演顺序如下:
一般来说,需要确保查询至少达到范围级别,最好是ref级别。
可能的关键字描述
可能的索引,指示MySQL可以使用哪些索引来优化查询。如果查询中涉及的字段有索引,它将被列出,但可能不会被查询使用。
关键描述
KEY列显示MySQL实际决定使用的索引,如果没有可用的索引,则为NULL。如果查询使用覆盖索引,则该索引仅出现在键列中。要强制MySQL使用或忽略POSSIBLE_KEYS列中的索引,请在查询中使用FORCE INDEX、USE INDEX或IGNORE INDEX。
KEY_LEN描述
指示索引中使用的字节数。查询中使用的索引的长度可以通过该列来计算。KEY_LEN显示的值是索引字段的最大可能长度。理论上长度越短越好,但不是实际长度。也就是说,KEY_LEN是根据表定义计算的,而不是从表中检索的。
参考描述
指示上表的联接匹配条件,即使用哪些列或常数来查找索引列上的值。
行描述
它指示MySQL根据表统计和索引选择找到所需数据要读取的行数。行的值是统计抽样结果,不完全准确。
额外描述
不适合在其他列中显示但很重要的附加信息有以下几种情况:
使用索引:覆盖索引用于查询以避免访问表。
使用where:MySQL将在存储引擎检索行后过滤它们。许多WHERE条件涉及索引中的列,当它读取索引时,存储引擎可以对其进行检查,因此并非所有带有WHERE子句的查询都会显示“using where”。
使用临时:MySQL需要使用临时表存储结果集,常用于排序、子查询和分组查询。
使用文件排序:MySQL中索引无法完成的排序操作称为文件排序。MySQL有两种方式对文件进行排序,这两种方式都可以在内存或磁盘上完成,并且通常以ORDER BY或GROUP BY查询的方式出现。
不存在:使用不存在来优化查询。
选择经过优化的表:直接通过索引获取数据,无需访问表。
使用连接缓冲区:表示在获取连接条件时不使用索引,需要连接缓冲区来存储中间结果。如果出现该值,应该注意的是,根据查询的具体情况,可能需要添加索引来提高性能。
索引失效是由以下原因造成的:
用于计算、函数、类型转换等操作的列。
列用法不等于,例如!=或者。
列使用IS NULL,IS NOT NULL。
模糊查询LIKE以通配符开始,如,
列使用OR来联接条件。
列使用IN和NOT IN。
隐式转换,类型错误,例如,field NUM是varchar,其中condition是number,NUM=1。
WHERE子句和ORDER BY使用同一个索引,ORDER BY的顺序与index的顺序相同,ORDER BY的字段按升序或降序排列,否则不使用索引。
复合索引不符合最佳左前缀原则,或者存在断点。
如果MYSQL评估使用索引比全表扫描慢,则不使用索引。
索引失败优化技巧
可读性:天天是卒,SQL语法优化方法及实例详解。
SQL执行序列
可读:分析SQL查询语句的执行顺序
本文来自网络,不代表「专升本要什么条件_专升本要几年_成人高考专升本_山东专升本信息网」立场,转载请注明出处:http://www.sdzsb8.cn/sbrx/18292.html