EXPLAIN
说明:
- 查看 SQL 的执行计划:
命令:
EXPLAIN SELECT * FROM 表名;
id | select_type | table | type | possible_keys | key | ken_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | 表名 | ALL | 38 |
結果说明:
一、 id:
- 说明: SELECT 识别符, 这是 SELECT 查询序列号, 这个不重要。
二、 select_type:
- 说明:
表示 SELECT 语句的类型。 - 具体值说明:
- 1、SIMPLE :表示简单查询,其中不包含链接查询和子查询。
- 2、PRIMARY :表示朱查询,或者是最外面的查询语句。
id | select_type | table | type | possible_keys | key | ken_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | PEIMARY | ALL | 38 | ||||||
1 | DERIVED | 表名 | ALL | 38 | Useing where |
- 3、UNION : 表示链接查询的第二个或后面的查询语句。
id | select_type | table | type | possible_keys | key | ken_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | PEIMARY | tb_order | ALL | 2 | |||||
2 | UNION | tb_order | ALL | 2 | |||||
UNION RESULT | union1,2 | ALL | 2 | Useing where |
- 4、 DEPENDENT UNION:UNION 中的第二个或后面的 SELECT 语句,取决于外面的查询。
- 5、 UNION RESULT: 链接查询的结果。
- 6、 SUBQUERY: 子查询中第一个 SELECT 语句
explain select * from tb_order where user_id = (select id from tb_user where name like '%lidong%')
id | select_type | table | type | possible_keys | key | ken_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | PEIMARY | tb_order | ref | FK_orders_1 | FK_order | 8 | const | 1 | using where |
2 | SUBQUERY | tb_user | ALL | 7 | using where |
-
7、DEPENDENT SUBQUERY : 子查询中的第一个 SELECT 语句,取决于外面的查询。
-
8、DERIVED :SELECT(FROM子句的子查询)
三 、table: 查询的表
四、type:
- 说明:
表示链接的类型。以下的链接类型的顺序是从最佳类型到最差类型: - 1、 system:表仅有一行, 这是const类型涉网特咧 , 平时不会出现, 这个可以忽略不计。
- 2、 const:数据表中最多只有一个匹配行,因为只匹配一行数据,所以很快, 常用 PRIMARY KEY 或者 UNIQUE 索引的查询, 可以理解为 const 是最优化的。
- 案例:
explain select * from 表名 where id = ?
id | select_type | table | type | possible_keys | key | ken_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | tb_order | const | PRIMRY | PRIMAR | 4 | const | 1 |
-
3、eq_ref :mysql 手册是这样说的"对于来自于前面的表的行组合,从该表中读取一行, 这可能是最好的链接类型,除了 const 类型, 他用在一个索引的所有部分被链接使用并且索引是 UNIQUE或PRIMARY KEY EQ_REF 可以用于使用 = 比较带索引的列。
-
explain select * from 表1 , 表2 where 表1.id=表2.id
id | select_type | table | type | possible_keys | key | ken_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | 表1 | ALL | fk_orders_1 | 1 | ||||
2 | SIMPLE | 表2 | eq_ref | PRIMARY | PRIMARY | 8 | MYBAT | 1 |
- 4、ref : 查询条件索引既不是 UNIQUE 也不是 PRIMARY KEY 的情况 ref 可用于 = 或 <或> 操作符的带索引的列。
id | select_type | table | type | possible_keys | key | ken_len | ref | rows | Extra |
---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | tb_order | ref | order_number | 62 | const | 1 | using index |
- 5、ref_or_null: 略
分析:
-
index_merge
该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。 -
unique_subquery
该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr)
unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。 -
ndex_subquery
该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr) -
range
只检索给定范围的行,使用一个索引来选择行。 -
index
该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。 -
ALL
对于每个来自于先前的表的行组合,进行完整的表扫描。(性能最差)
五、possible_keys
指出MySQL能使用哪个索引在该表中找到行。
如果该列为NULL,说明没有使用索引,可以对该列创建索引来提高性能。
六、key
显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。
可以强制使用索引或者忽略索引:
强制忽略索引:
explain select * from tb_user igore index(age) where age < 10
强制使用索引:
explain select * from tb_user use index(age) where age < 10
七、 key_len
显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。
注意:key_len是确定了MySQL将实际使用的索引长度。
八、 ref
显示使用哪个列或常数与key一起从表中选择行。
九、rows
显示MySQL认为它执行查询时必须检查的行数
十、Extra
该列包含MySQL解决查询的详细信息
- Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
- Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
- range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
- Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
- Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
- Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。
- Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
- Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
- Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
下面几种情况下索引不会生效:
- like:
如果 & 匹配到第一个字符是不起作用的。 - 使用联合查询:
只有在条件中出现索引字段才会生效。 - or:
查询条件中只有 or 关键字,并且条件中两个列都是索引才会生效。
优化 MYSQL 参数:
- key_buffer_size:
索引缓存区大小, - table_cache:
同时打开表的个数。 - query_cache_size:
查询缓冲区的大小。
当 query_cache_size=0 所有查询都不会进行缓存。但是当 query_cache_type=0 不会导致query_cache_size 配置的缓存区释放,当query_cache_type=1 所有的查询都会进缓存区,除非sql中指定 SQL_NO_CACHE ,
SELECT SQL_NO_CACHE FROM 表名 ,query_cache_type=2 只有在sql 中使用 SQL_CACHE 才会进缓存区。 - sort_buffer_size:
排序缓存区,值越大排序越快。 - read_buffer_size:
每个线程扫描每张表的缓存大小。 - read_rnd_buffer_size:
略 - innodb_buffer_pool_size:
值越大查询的越快,适当 - max_connections:
最大链接数 - inndb_flush_log_at_trx_commit:
将缓存区数据写入日志。
0:每隔一秒写
1:提交事物写
2:每次提交日志写,每隔一秒写
默认1 - back_log:
略 - interactive_timeout:
服务器关闭链接前等待得秒数。 - sort_buffer_size:
可以提高 order by 和 group by 效率,默认是2097144 2M - thread_cache_size:
复用线程数 - wati_timeout:
服务器关闭链接时行动秒数。 默认 28800
网友评论