连接断开相关:客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数 wait_timeout 控制的,默认值是 8 小时。 如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。这时候如果你要继续,就需要重连,然后再执行请求了。数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
全部使用长连接后,你可能会发现,有些时候 MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。怎么解决这个问题呢?你可以考虑以下两种方案。
词法分析
分析器首先会做词法分析,查询语句中包括了多个字符串和空格组成,Mysql需要识别出里面的字符串分别代表什么。
mysql> select * from Student where ID=1;
分析这条查询语句,"select"关键字可以识别出是一个查询语句。 字符串"Student"识别出是表名"Student",把字符串"ID"识别成列"ID"。
ounter(line
语法分析
词法分析后,语句法分析会根据语法规则,判断输入的SQL语句是否满足MySql语法。如果语法不对,会收到“You have an error in your SQL syntax”的错误提醒。例如
mysql> elect * from Student where ID=1; ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'elect * from t where ID=1' at line 1
技巧:一般语法错误看错误提示的时候,要关注的是紧接“use near”的内容
ounter(line
ounter(line
ounter(line
优化器
分析器执行之后,到达了优化器。
优化器会做那些优化处理:
当在表中有多个索引的时候,优化器会决定这条查询语句使用哪个索引
一个查询语句有多表关联(join)的时候,决定各个表的连接顺序。
例子如下:
mysql> select * from t1 join t2 using(ID) where t1.c=10 and t2.d=20;
两种关联查询方案结果肯定是一样的,但是执行效率会有不同,优化器就是决定选择使用哪一个方案。
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。