EXPLAIN句法 优化表结构

EXPLAIN tbl_name or EXPLAIN SELECT select_options

EXPLAIN tbl_name是DESC[RIBE] tbl_name或SHOW COLUMNS FROM tbl_name的一个同义词。
当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联结和以什么次序联结的信息。

借助于EXPLAIN,你可以知道
 1)你什么时候必须为表加入索引以得到一个使用索引找到记录的更快的SELECT。
 2)你也能知道优化器是否以一个最佳次序联结表。为了强制优化器对一个SELECT语句使用一个特定联结次序,增加一个STRAIGHT_JOIN子句。

对于非简单的联结,EXPLAIN为用于SELECT语句中的每个表返回一行信息。表以他们将被读入的顺序被列出。
 MySQL用一边扫描多次联结的方式解决所有联结,这意味着MySQL 1)从第一个表中读一行,2)然后找到在第二个表中的一个匹配行,3)然后在第3个表中等等。=>当所有的表被处理完,它输出选择的列并且回溯表列 表直到找到一个表有更多的匹配行,从该表读入下一行并继续处理下一个表。           

从EXPLAIN的输出包括下面列:

table
 输出的行所引用的表。

type
 联结类型。各种类型的信息在下面给出。

possible_keys
 possible_keys列指出MySQL能使用哪个索引在该表中找到行。
 注意,该列完全独立于表的次序。这意味着在possible_keys中的某些键实际上不能以生成的表次序使用。
 如果该列是空的,没有相关的索引。在这种情况下,你也许能通过检验WHERE子句看是否它引用某些列或列不是适合索引来提高你的查询性能。如果是这样,创 造一个适当的索引并且在用EXPLAIN检查查询。见7.8 ALTER TABLE句法。为了看清一张表有什么索引,使用SHOW INDEX FROM tbl_name。 (可以查出,哪些索引基本上未用,或用的少)

key
 key列显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。

key_len
 key_len列显示MySQL决定使用的键长度。如果键是NULL,长度是NULL。注意这告诉我们MySQL将实际使用一个多部键值的几个部分。

ref
 ref列显示哪个列或常数与key一起用于从表中选择行。

rows
 rows列显示MySQL相信它必须检验以执行查询的行数。

Extra
 如果是Only index,这意味着信息只用索引树中的信息检索出的。通常,这比扫描整个表要快。
 如果是where used,它意味着一个WHERE子句将被用来限制哪些行与下一个表匹配或发向客户。
 如果是impossible where 表示用不着where

Type的取值常会有下面这些:

system
 表仅有一行(=系统表)。这是const联结类型的一个特例。

const
 表有最多一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被剩下的优化器认为是常数。 const表很快,因为它们只读取一次!

eq_ref
 对于每个来自于先前的表的行组合,从该表中读取一行。这可能是最好的联结类型,除了const类型。它用在一个索引的所有部分被联结使用并且索引是UNIQUE或PRIMARY KEY。

ref
 对于每个来自于先前的表的行组合,所有有匹配索引值的行将从这张表中读取。
 如果联结只使用键的最左面前缀,不或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联结能基于键值选择单个行的话),使用ref。如果被使用的键仅仅匹配一些行,该联结类型是不错的。

range
 只有在一个给定范围的行将被检索,使用一个索引选择行。ref列显示哪个索引被使用。

index
 这与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。

ALL
 对于每个来自于先前的表的行组合,将要做一个完整的表扫描。
 如果表格是第一个没标记const的表,这通常不好,并且通常在所有的其他情况下很差。你通常可以通过增加更多的索引来避免ALL,使得行能从早先的表中基于常数值或列值被检索出。

通过相乘EXPLAIN输出的rows行的所有值,你能得到一个关于一个联结要多好的提示。这应该粗略地告诉你MySQL必须检验多少行以执行查询。当你使用max_join_size变量限制查询时,也用这个数字。见10.2.3 调节服务器参数。
时间: 2024-08-05 02:55:20

EXPLAIN句法 优化表结构的相关文章

MySQL优化四(优化表结构)

body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10px; padding-bottom: 10px; background-color: white; padding: 30px } body>*:first-child { margin-top: 0 !important } body>*:last-child { margin-bottom:

SQL优化的四个方面,缓存,表结构,索引,SQL语句

一,缓存 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO. query_cache_size/query_cache_type (global) Query cache 作用于整个 MySQL Instance,主要用来缓存 MySQL 中的 ResultSet,也就是一条S

7.使用EXPLAIN 来分析SQL和表结构_1

explain:查看执行计划 使用explain 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的 分析你的查询语句或是表结构的性能瓶颈 使用explain 可以获取哪些信息: 表的读取顺序 数据读取操作的操作类型 哪些索引可以使用 哪些索引被实际使用 表之间的引用 每张表有多少行被优化器查询 explain + sql语句 执行计划包含的信息: 1.id select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 2.select_

mysql数据库性能优化(包括SQL,表结构,索引,缓存)

优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段.降低 CPU 计算除了 IO 瓶颈之外,SQL优化中需要考虑的就是 CPU 运算量的优化了.order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算).当我们的 IO 优化做到一定阶段之后

优化的四个方面,缓存,表结构,索引,SQL语句

一,缓存 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所以,要优化数据库,首先第一步需要优化的就是 IO,尽可能将磁盘IO转化为内存IO. query_cache_size/query_cache_type (global) Query cache 作用于整个 MySQL Instance,主要用来缓存 MySQL 中的 ResultSet,也就是一条S

mySQL表结构优化

前言 很多人都将<数据库设计范式>作为数据库表结构设计"圣经",认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求.殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用

MySQL详解(22)------------表结构优化

很多人都将 数据库设计范式 作为数据库表结构设计"圣经",认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求.殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.此课时整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会

mysql优化之sql执行流程及表结构(schema)对性能的影响

part 1 sql执行流程(如下图所示) 1.客户端发送一条查询到服务器. 2.服务器通过权限检查后,先检查查询缓存,命中则直接返回结果.否则进入3. 3.服务器进行sql解析,预处理,再由优化器根据该sql涉及到的数据表的信息计算,生成执行计划. 4..MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询:5..将结果返回给客户端. 总结:SQL执行的最大瓶颈在于磁盘的IO,即数据的读取:不同SQL的写法,会造成不同的执行计划的执行,而不同的执行计划在IO的上面临完全不一样的数

数据库性能之表结构优化

一.表结构优化 1.数字类型:存储空间浪费,空间大小不一样,搜索速度也不一样 (1).tinyint 8位 -128~127 unsigned tinyint(0~255) int,bigint,能确定不会使用负数的字段,建议添加unsigned定义 (2).固定精度的小数,不建议使用decimal表示,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附件维护成本,比如钱都是精确到分,不存3.12元,存312分 2.字符类型: (1).char类型:定长类型 (2).不定长类