存储结构区分
应用层区分
EXPLAIN (SQL语句)

| 类型 | 说明 |
|---|---|
| Using filesoft | MySQL有两种方式可以生成有序的结果,通过排序操作或者使用索引,当Extra中出现了Using filesoft说明MySQL使用了后者,但注意虽然叫filesoft但并不是说明就是用了文件来进行排序,只要可能排序 都是在内存里完成的。大部分情况下利用索引排序更快,所以一般这时也要考虑优化查询了。使用文件完成排序操作,这是可能是order by,group by语句的结果,这可能是一个CPU密集型的过程,可以通过选择合适的索引来改进性能,用索引来为查询结果排序。 |
| using filesort | 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。常见于order by和group by语句中 |
| Using temporary | 用临时表保存中间结果,常用于group by和order by操作中,一般看到它说明查询需要优化了,就算避免不了临时表的使用也要尽量避免硬盘临时表的使用。 |
| Using where | 使用了where从句来限制哪些行将于下一张表匹配或者返回给用户。注意:Extra列出现Using where表示MySQL服务器将存储引擎返回服务层以后再应用where条件过滤 |
| Using join buffer | 使用了连接缓存:Block Nested Loop,连接算法是块嵌套循环连接;Batched Key Access,连接算法是批量索引连接 |
| Using index | 表示相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。 |
| Using index condition | 这是MySQL 5.6出来的新特性,叫做"索引条件推送"。简单说就是MySQL原来在索引上是不能执行如like这样的模糊匹配操作的,但是现在可以了,这样减少了不必要的IO操作,但是只能用在二级索引上。 |
| using_union | 表示使用or连接各个使用索引的条件时,该信息表示从处理结果获取并集 |
| using intersect | 表示使用and的各个索引的条件时,该信息表示是从处理结果获取交集 |
| using sort_union | 与前面两个对应的类似,只是他们是出现在用and和or查询信息量大时,先查询主键,然后进行排序合并后,才能读取记录并返回。 |
| sing sort_intersection | 同上 |
| no tables used | 不带from字句的查询或者From dual查询使用not in()形式子查询或not exists运算符的连接查询,这种叫做反连接。即,一般连接查询是先查询内表,再查询外表,反连接就是先查询外表,再查询内表。 |
| Not exists | MySQL优化了left join,一旦它找到了匹配left join标准的行,就不再搜索了 |
| impossible where | where子句的值总是false,不能用来获取任何元组 |
| select tables optimized away | 在每有group by子句的情况下,基于索引优化min/max操作,或者对于MyISAM存储引擎优化count(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。 |
| distinct | 在select部分使用了distinc关键字 |

主库已经将事务 commit 到了存储引擎层,应用已经可以看到数据发生了变化,只是在等待返回而已。如果此时主库宕机,可能从库还没写入 Relay Log,就会发生主从库数据不一致 (如下图)

MySQL 5.7 引入了增强半同步复制。“Waiting Slave dump” 被调整到了 “Storage Commit” 之前,即主库写数据到 binlog 后,就开始等待从库的应答 ACK,直到至少一个从库写入 Relay Log 后,并将数据落盘,然后返回给主库 ACK,通知主库可以执行 commit 操作,然后主库再将事务提交到事务引擎层,应用此时才可以看到数据发生了变化。
