zoukankan      html  css  js  c++  java
  • SQL语句是如何在MySQL内部执行的

    MySQL的内部组件,主要分为server层和引擎层。客户端和server进行连接以及发送sql,由server进行一系列的处理调用存储引擎获取数据。

    server层:涵盖了绝大多数的MySQL的服务,包括内置函数、触发器、视图等功能都在这一层实现

      连接器:管理连接以及进行权限校验,比如navicat、jdbc等各种各样的客户端都要通过连接器和Server端建立连接

      缓存:客户端发过来一条sql,会先从缓存中取数据,大多数情况下不会太多使用缓存,对于一些不经常变化的,比如系统配置、菜单等可以考虑使用。在8.0中已经移出了缓存

      词法分析器:词法分析、语法分析

      优化器:生成执行计划和选择索引

      执行器:调用引擎接口和获取查询结果

    引擎层主要包含了我们使用的存储引擎,比如innodb、myisam等,这一层的设计是插件式的,一个Mysql支持多个存储引擎,现在最常用的是innodb,如果创建表不指定默认就是innodb。

    连接器:

    [root@192 ~]# mysql -h host[数据库地址] -u root[用户] -p root[密码] -P 3306
    mysql> CREATE USER 'username'@'host' IDENTIFIED BY 'password'; // 创建新用户
    mysql> grant all privileges on *.* to 'username'@'%'; // 赋与用户权限,%表示所有host
    mysql> flush privileges // 刷新
    mysql> update user set password=password(”test″) where user=’root’;// 设置用户名密码
    mysql> show grants for root@"%"; // 查看当前用户的权限

    查看连接:

     show processlist; 

    Command为Sleep表示空闲连接,server长时间没有收到客户端的命令,就会把这个连接给断开,默认8小时set global wait_timeout命令设置

    mysql> show global variables like "wait_timeout";
    mysql> set global wait_timeout=3600; 

    查询缓存:

      MySQL会在这个地方加一个k-v的缓存,k就是sql,v就是结果,如果能命中,就返回缓存的结果,但是一般情况下是比较鸡肋的,可能建好的缓存没用过,就被更新清除了,现在8.0之后已经移出的缓存。不过对于一些相对静态的信息还是有用的,比如系统菜单、系统配置等。缓存也是可以进行一些配置的。

    my.cnf
    #0:OFF,1:ON,2:DEMAND,当sql语句中有SQL_CACHE关键词时才缓存
    query_cache_type=2

    像上面这样配置,只有显示指定,才会使用缓存,如下:

    mysql> select SQL_CACHE * from user where id = 1;

    查看是否开启缓存:

    mysql> show global variables like "%query_cache_type%";

    查看缓存的信息:

    mysql> show status like'%Qcache%';

    通过这些指标可以有针对性对缓存进行调整。

    分析器:

    没有命中缓存,那就要开始准备sql语句执行了,分析器就是用来解析发送过来的sql,分析你到底想要什么。会先做词法分析,比如把字符串识别成字段名或者表名等等,组装之后在进行语法分析,看是不是符合MySQL的语法标准。

    优化器:

    执行之前,要对sql语句进行优化,比如要使用什么索引,要以什么顺序关联表等等,优化器会选择它认为效率更高的方式。

    执行器:

    执行器调用存储引擎的接口查询数据,返回执行结果。

    MySQL的内部核心组件大体功能如上所示,对于我们开发人员,如果不是DBA,更多的精力要放在业务实现和sql优化上。

  • 相关阅读:
    [数字证书] 怎么打开windows的数字证书管理器
    [RF] 安装好Robot Framework之后怎样让启动的界面后面不带命令行窗口,且图片以机器人显示
    [RF]怎样用Robot Framework写好Test Case?
    iptables的疑问
    centos6.5安装jenkins文档部署全过程
    haproxy+keepalived以及haproxy的原理特点
    rhel6.5安装ansible
    客户端执行rsync出现的错误
    LVS_DR 安装后无法转发真实服务器,但是配置其他方面都检查的没有问题了。就剩在realserver这边没有在lo口上绑定VIP了
    架构设计:负载均衡层设计方案(1)——负载场景和解决方式
  • 原文地址:https://www.cnblogs.com/dlcode/p/14242233.html
Copyright © 2011-2022 走看看