一条sql的执行[mysql]
这段时间得好好深入地进入到mysql的内部,探求其内部秘密,写出更好的sql,以便面试可以吹更大的🐂13
mysql基本架构示意图
mysql分为Server和存储引擎两个部分,Server包括连接器,查询缓存,分析器,优化器,执行器。
连接器:
执行连接mysql时候,使用
mysql -h$ip -P$port -u$user -p$password
错误:提示 “Access denied for user”
正确:连接器会到权限表中查询拥有的权限信息,之后连接中的权限判断都依赖此时读取到的权限
使用长连接保持数据库的连接,为了防止内存太大导致溢出,可以定期断开长连接,然后查询时候在重连。
如果是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。
查询缓存:
1 连接建立完成后,你就可以执行 select 语句了。执行逻辑就会来到第二步:查询缓存。 2 3 MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。 4 5 如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。 6 7 但是大多数情况下我会建议你不要使用查询缓存,为什么呢?因为查询缓存往往弊大于利。 8 9 查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。因此很可能你费劲地把结果存起来,还没使用呢,就被一个更新全清空了。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。 10 11 好在 MySQL 也提供了这种“按需使用”的方式。你可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存。而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定,像下面这个语句一样: 12 13 mysql> select SQL_CACHE * from T where ID=10; 14 需要注意的是,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。
以上为引用-自购极客时间,林老师课程
分析器:
解析sql语句识别字符串,语法校验
优化器:
一张表中索引如果有多个,决定使用索引
连表查询时候,是先执行左表还是右表的操作
执行器:
先判断当前连接是否有操作表的权限,再执行sql语句
--以上为学习笔记
平凡是我的一个标签