①一条查询语句如何执行?
关于一条mysql查询语句在mysql中的执行流程
如select name from test where id=10;
①连接器---先与mysql服务端连接器建立连接,若查询缓存命中则直接返回 (查询缓存的弊端:查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空.)
以update a set name=1 where id=1;
主要区别在于在查询到数据之后(select name from a where id=1),如果是innodb引擎它会进行日志的两阶段提交:
①开启事务,写入redolog(innodb引擎特有),并更新内存
将这个更新操作(也可能是插入) 缓存在change buffer中 (redolog也会记录这个change buffer操作)等到下一次查询要用到这些数据时,再执行这些操作,改变数据(称为合并操作记录称为merge).
innodb_change_buffer_max_size
innodb_change_buffering
先介绍两个概念
因为redolog是环形日志,当redolog写满时,就需要"擦掉"开头的一部分数据来达到循环写,这里的擦掉指,指将redolog日志的checkpoint位置从 CP推进到CP' ,同时将两点之间的脏页刷到磁盘上(flush操作),此时系统要停止所有的更新操作(防止更新操作丢失)
①系统内存不足.当要读取新的内存页时就要淘汰一些数据页,如果淘汰的正好是脏页,就要执行一次flush操作
上述后两者场景(系统空闲和正常关闭)对于性能都没太大影响.
当为第一种redolog写满时,系统无法执行更新操作,所有操作都会堵塞
当为第二种内存不够用时,如果淘汰脏页太多,影响mysql响应时间
后两者刷脏页会影响性能,所以Mysql需要有刷脏页控制策略,可以从以下几个设置项考虑
①设置innodb_io_capacity告诉innodb所在主机的IO能力
首先创建连接
就创建个Cnnection对象,然后把驱动加上,还有帐号密码什么的!我没连过sql数据库,不知道驱动,你可以在网上搜一下.
给你一个我连接mysql数据库的例子
public Connection Getdata(){//这是连接数据库的一个方法,还可以配置连接池.
Connection con=null;
try {
Class.forName("com.mysql.jdbc.Driver");//加驱动
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
}
return con;
public void delete(int id){//对数据库进行操作的方法,先调用上面写好的连接!
Connection con=Getdata();
Statement st;
st=con.createStatement();
st.executeUpdate("delete from kaoshi where id="+id);
// TODO Auto-generated catch block
如果查询缓存没有命中,那么SQL请求会进入分析器,分析器是用来分辨SQL语句的执行目的,其执行过程大致分为两步:
所处的位置如上图所示,这节的重点在优化器中的逻辑变换和代价优化上.
逻辑变换也就是在关系代数基础上进行变换,其目的是为了化简,同时保证SQL变化前后的结果一致,也就是逻辑变化并不会带来结果集的变化.其主要包括以下几个方面:
代价优化是用来确定每个表,根据条件是否应用索引,应用哪个索引和确定多表连接的顺序等问题.为了完成代价优化,需要找到一个代价最小的方案.所以呢,优化器是通过基于代价的计算方法来决定如何执行查询的(Cost-based Optimization).简化的过程如下:
由上可以看出创建临时表的代价是很高的,尤其是内部的myisam或innodb临时表.MySQL 引擎层代价保存在表engine_cost中,其具体内容如下:
目前io_block_read_cost和memory_block_read_cost默认值均为1,实际生产中建议酌情调大memory_block_read_cost,特别是对普通硬盘的场景.MySQL会根据SQL查询生成的查询计划中对应的操作从上面两张代价表中查找对应的代价值,并且进行累加形成最终执行SQL计划的代价.再将多种可能的执行计划进行比较,选取最小代价的计划执行.
当分析器生成查询计划,并且经过优化器以后,就到了执行器.执行器会选择执行计划开始执行,但在执行之前会校验请求用户是否拥有查询的权限,如果没有权限,就会返回错误信息,否则将会去调用MySQL引擎层的接口,执行对应的SQL语句并且返回结果.例如SQL:"SELECT * FROM userinfo WHERE username = 'Tom';"假设 "username" 字段没有设置索引,就会调用存储引擎从第一条开始查,如果碰到了用户名字是" Tom", 就将结果集返回,没有查找到就查看下一行,重复上一步的操作,直到读完整个表或者找到对应的记录.需要注意SQL语句的执行顺序并不是按照书写顺序来的,顺序的定义会在分析器中做好,一般是按照如下顺序:
如果命中的记录比较多,应用会从MySql Server一批批获取数据
在新建的这个空白里面粘上你的语句们 鼠标不要勾选它们,只是粘进去就好了
大功告成啦~
以上就是土嘎嘎小编为大家整理的怎么在mysql执行语句相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!