mysql的构成
server层
连接器
客户端连接到mysql数据库的时候,接待你的是连接器。连接器是连接器负责跟客户端建立连接、获取权限、维持和管理连接。在完成3次tcp握手后,通过账号密码进行身份验证,验证通过后从权限表里面读取权限,该链接后续的操作权限都是基于这个时候读取的权限。
数据库连接有长连接和短连接,和tcp的很类似,都是连接器长期持有这些连接。长连接是客户端有请求时长时间持有这个连接,而短连接则是短暂的处理之后就断掉,建议客户端使用连接池,来保持多个长连接,减少连接的成本。
但是可能出现OOM异常,原因如下:mysql在执行过程中临时使用的内存是管理在连接对象里面的,这些资源会在连接断开才释放,一直保持长连接,可能导致内存占用太大。解决方案为当你执行一个大的操作时,通过执行 mysql_reset_connection 来重新初始化连接资源,这个过程不需要重连,只是释放这个连接在mysql中占用的内存,将其初始化到最初形态。
一个连接建立连接后,管理员修改了其权限,但是不会影响其现在的连接,权限的修改只能影响到新的连接。
查询缓存
当你连接建立完毕后,使用select语句的时候,可以从查询缓存里面查询,因为在这个查询缓存里面 查询语句,结果,会以键值对的方式放到里面,当可以从查询缓存里面取出数据时返回,但是,你缓存表的数据出现问题时,缓存就会失效,因此很不划算,在mysql8已经取消查询缓存这个模块。
分析器
真正的第二步。在这个步骤里面,mysql会对sql进行词法分析,词法分析器会对sql进行分析,判断其是否符合mysql语法。
优化器
mysql的优化器是为了提高sql的效率,比如表里面有多个索引,用哪个索引(一条sql一个表只用一个索引),表连接,比如内连接,谁连接谁,优化器会采用优化策略,让有索引的放在右边边被连接,或者都有索引的,且高度一样的。小表放在左边,因为左边的表是必须全扫描的。对表连接感兴趣的可以看我的下面这个文章,关于表的连接算法。
点我一下就到了
执行器
经过优化器后,下一步就是执行,执行这个必须先判断你是否有这个权限,然后通过表的引擎来执行,比如查询,如果没有索引,那么就通过存储引擎读取第一行数据,执行器调用一次,扫描一次。比较,然后不断循环直到找到数据,或者循环完毕。使用索引同样的道理。我们以前查看explain查看扫描的行树,来看查询效率。但是在有些情况下,执行器执行一次,引擎扫描多行数据。就是调用存储引擎干活。
between 和大小范围
between a and b。
这个是索引的between,逻辑如下,先找到a,或者第一个大于a的,然后不断向后取数据,直到出现数据大于b为止。