1、会回滚所有活动事务,并重置自动提交模式;
2、会释放所有的锁表;
3、所有的临时表会被关闭并清除;
4、Session 系统变量会被重新初始化为相应的全局系统变量的值;
5、用户自定义变量会丢失;
6、会释放 Prepared statements;
7、HANDLER 变量会被关闭;
8、LAST_INSERT_ID() 函数的值会被重置为 0;
9、通过 GET_LOCK() 函数获得的锁会被释放;
以上影响,翻译自官方文档,有些可能不太准确,有兴趣的可以到官网自行查阅原文。
数据库连接池?
另外,不少实际的应用框架中,大都使用连接池来维护连接数。
数据库连接池,就是服务器应用建立多个连接到数据库,还没有用的连接就放到连接池上,要的时候就向连接池取,这样比没有连接时再建立新的连接(TCP 建立连接是需要时间的)时要快很多,从而提高传输效率。
如 Spring 框架中,它实现了一个持久连接池,允许其他程序、客户端来连接,这个连接池将被所有连接的客户端共享使用,连接池可以加速连接,也可以减少数据库连接,降低数据库服务器的负载。
2 查询缓存缓存,就是提前预备好的数据,数据库查询缓存也是缓存的一种。
在解析一个查询语句之前,如果查询缓存是打开的,那么 MySQL 会优先检查这个查询是否命中查询缓存中的数据。
如果当前的查询恰好命中了查询缓存,那么在返回查询结果之前 MySQL 会检查一次用户权限。若权限没有问题,MySQL 会跳过所有其他阶段(解析、优化、执行等),直接从缓存中拿到结果并返回给客户端。
这种情况下,查询不会被解析,不用生成执行计划,不会被执行。
缓存哪里来的?查询时如果没有命中查询缓存,MYSQL 会判断该查询是否可以被缓存,而且系统中还没有对应的缓存,则会将其结果写入查询缓存。
mysql query cache 的内容为 select 的结果集,在内存中是以 HASH 结构来进行映射。
cache 会使用完整的 sql 字符串做 key,并区分大小写,空格等。即两个 sql 必须完全一致才会导致 cache 命中。
缓存何时失效?在表的结构或数据发生改变时,查询缓存中的数据不再有效。
所以查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用。
a) 一旦表数据进行任何一行的修改,基于该表相关 cache 立即全部失效,并且从缓冲区中移出;
b) 为什么不做聪明一点判断修改的是否 cache 的内容?因为分析 cache 内容太复杂,服务器需要追求最大的性能。
缓存可以提高查询效率的?当有大量的查询和大量的修改时,cache 机制可能会造成性能下降。
因为每次修改会导致系统去做 cache 失效操作,这就会造成不小的开销。
另外系统 cache 的访问由一个单一的全局锁来控制,这时候大量的查询将被阻塞,直至锁释放。
所以不要简单认为设置 cache 必定会带来性能提升。
参考:https://www.cnblogs.com/duanxz/p/4385733.html
其实,在 8.0 版本开始,缓存功能被直接删除。
3 解析器 词法解析词法分析的作用是将整个查询分解为多个元素。
我们输入的 MySQL 命令,不过是一串长长的字符串,MySQL 的分析器会对其进行词法解析。
select * from T where ID=1;比如,上述语句是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。
MySQL 从你输入的 select 这个关键字识别出来,这是一个查询语句。
它也要把字符串 T 识别成一个表名,把字符串 ID 识别成一个列。
其实,大家也可以思考一下,若让你手写一个词法分析的工具,你该如何实现呢?
语法分析做完初步的词法分析后,就要做语法分析。
根据词法分析的结果,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。
如果你的语句不对,就会收到 You have an error in your SQL syntax 的错误提醒。
解析器的最终执行结果就是解析树,提供给优化器使用。
4 优化器当你提交一个查询的时候,MySQL会分析它,看是否可以做一些优化使处理该查询的速度更快。
优化器到底干啥的?MySQL 的优化器有几个重要任务:
1、选择最合适的索引;
2、选择表扫还是走索引;
3、选择表关联顺序;
4、优化 where 子句;
5、排除管理中无用表;
6、决定 order by 和 group by 是否走索引;
7、尝试使用 inner join 替换 outer join;
8、简化子查询,决定结果缓存;
9、合并试图;
MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行。