MySQL 客户端/服务端 协议
虽然你不必明白MySQL客户端/服务端的协议的细节,但是你必须明白在更高一层它的工作方式。协议是半双工的。意思就是在任意的时间内,MySQL服务端既可以发送或者接受消息,但是不能同时。也意味着没法减少消息。
这种协议是MySQL通信简单而快速。但是也有一些限制。比如,没有流程控制。一旦一端发送一个消息,另一端在相应之前就必须获取整个信息。有点像投掷球的游戏:一个时刻每一方只能有一个球,并且你没有球就不能投掷。
客户端发送一个语句到服务端作为一个单独的数据包。如果你有一个大的语句,max_packet_size就对你很重要。一旦一个客户端发送一个语句,如果没有相应,它只能等待结果。。
相比较而言,从服务端的响应常常有许多数据包组成。当服务端相应的时候,客户端必须要接受整个结果集。它不能仅仅获取一些行并且之后再要求服务器没必要发剩下的数据。如果客户端仅仅需要不分行返回,它既然要等待服务器所有的数据包并且还要抛弃它们不需要的,或者以不好的方式断开连接。两者都是不好的方法,这就是为什么LIMIT条件如此的重要。
关于这点,还有另一方面值得思考:当一个客户端从服务端获取一些行,这是个"pulling拉"的过程。但是事实上,MySQL服务端当生成数据的时候就pushing推送这些行。这个客户端仅仅是接收这些“推”的数据。没有方法告诉服务器停止发送数据。客户端就是 “drinking from the fire hose,”貌似是一直在汲取。。。可以这么说吧。。。
大部分连接MySQL的库既可以获取整个结果集并且缓冲到内存中,或者获取你需要的每一行。默认的行为就是获取所有的结果并且把它们缓冲到内存中。这是非常重要的,因为在所有的行被获取之前,MySQL服务端不会释放语句所需要的锁和其他资源。这个语句的状态为“Sending Data”状态。(在以后的部分会说到语句状态的。)当客户端库获取到所有结果,它减少了服务端要工作的数目:服务端完成并且尽可能快的清楚这个语句。
事实上,虽然你的结果集是从客户端的内存中的缓冲区中获得,但是大部分客户端可以让你把这个过程看做从服务端直接返回。大部分时间这种方式都可以正常工作,但是对于大结果就不是一个好方法,因为大结果集需要消耗许多时间和大量内存。如果你指定库不缓冲结果,你可以使用更少的内存,并且更快的对结果集进行操作。缺点就是当应用和库交互的时候,服务端的锁和其他资源还是打开状态。
让我们看看PHP一个例子。首先,来看看经常使用的查询例子
<?php
$link = mysql_connect('localhost', 'user', 'p4ssword');
$result = mysql_query('SELECT * FROM HUGE_TABLE', $link);
while ( $row = mysql_fetch_array($result) ) {
// Do something with result
}
?>
这个代码看上去的意思是当你需要这个结果的时候,再去获取行。然而这个代码早就通过mysql_query函数把结果缓存了。这个while仅仅是用来循环缓冲区的。相比较下,下面的代码才是不需要缓冲结果的,因为使用了mysql_
unbuffered_query( )替代了mysql_query( ):
<?php
$link = mysql_connect('localhost', 'user', 'p4ssword');
$result = mysql_unbuffered_query('SELECT * FROM HUGE_TABLE', $link);
while ( $row = mysql_fetch_array($result) ) {
// Do something with result
}
?>
编程语言有不同的方法去覆盖缓冲。一个例子,Perl DBD:;mysql驱动需要你指定C库的mysql_use_result属性(默认为mysql_buffer_result)。代码如下
#!/usr/bin/perl
use DBI;
my $dbh = DBI->connect('DBI:mysql:;host=localhost', 'user', 'p4ssword');
my $sth = $dbh->prepare('SELECT * FROM HUGE_TABLE', { mysql_use_result => 1 });
$sth->execute( );
while ( my $row = $sth->fetchrow_array( ) ) {
# Do something with result
}
要注意的是调用prepare函数指定了使用结果而不是缓冲。你也可以在连接的时候指定,这样每个语句都不会被缓冲。
my $dbh = DBI->connect('DBI:mysql:;mysql_use_result=1', 'user', 'p4ssword');
查询语句代码
每个MySQL连接,或者线程,都有状态来表示某一时刻到底在做什么。有很多方法来查看这些状态,最简单的方法就是使用SHOW FULL PROCESSLIST命令。这个状态会出现在Command列。作为一个查询语句贯穿整个周期,它的状态也变化多次,并且有12个状态。MySQL手册会有详细说明,我们仅仅列出其中的几个,来看看它们的意思。
Sleep
这个线程正在等待从客户端来的新语句。
Query
这个线程可能执行了语句或者发送一个结果到客户端。
Locked
这个线程正在等待在服务端被授权的表锁。锁是由存储引擎所实现的,比如InnoDB是行锁,就不会导致线程locked状态。
Analyzing and statistics
这个线程在检查存储引擎的统计以及语句的优化。
Copying to tmp table [on disk]
这个线程正运行一个查询并且把结果复制到临时表中。可能使用了GROUP BY或者UNION.如果结果以on disk结尾,那么已经把内存表转为在硬盘上的表。
Sorting result
这个县城在排序结果
Sending data
表达意思很多:线程可能在各个语句阶段发送数据,生成结果集或者返回结果集到客户端。
这会帮助你了解基本的状态,因此你可以看到到底”谁拿到了球“。在一个非常忙的服务器,你可能看到不寻常的状态,比如,statistics。开始消耗大量重要的时间。常常意味着发生了一些错误。
分享到:
相关推荐
MySQL客户端工具用于与服务端交互,执行SQL语句,管理和维护数据库。压缩包中提供了两种客户端工具:mysql-workbench和Navicat Lite for MySQL。 1. **mysql-workbench**:是MySQL官方出品的图形化管理工具,支持...
7. 性能优化:为了确保MySQL服务器的高效运行,你还需要关注性能优化,比如调整内存设置、使用索引、优化查询语句等。 8. 安全性:为了保护数据库免受攻击,你需要定期更新MySQL到最新版本,限制不必要的网络访问,...
除此之外,还有许多图形化的MySQL客户端工具,如MySQL Workbench、Navicat、phpMyAdmin等,它们提供了更直观的界面和丰富的功能,适合不熟悉命令行或者需要更高效管理数据库的用户。如果对MySQL自带的客户端不习惯,...
服务端可能通过执行SQL语句来读写数据,满足客户端的需求。 4. **通信协议**:“接发包”这个文件夹可能包含了关于数据包的发送和接收的实现,这是客户端和服务端之间通信的基础。数据包通常包含了请求信息、状态...
- 复杂查询优化:改进了查询优化器,处理复杂SQL语句的能力更强。 2. MySQL-Front客户端: - 图形化界面:为用户提供直观的界面,使得数据库管理变得更加简单。 - 数据操作:支持创建、修改、删除数据库表,以及...
本压缩包包含的“易语言MYSQL客户端源码”和“易语言MYSQL服务端源码”是基于易语言实现的MySQL数据库的网络通信解决方案。 首先,我们要理解MySQL是一种广泛使用的开源关系型数据库管理系统,它具有高效、稳定和...
4. **MySQL数据库操作**:包括创建表,插入、查询、更新和删除数据,事务处理,以及优化查询性能等。 5. **Android网络编程**:使用HttpURLConnection或者OkHttp等库进行网络请求,处理异步任务,确保用户界面的...
客户端通过网络与MySQL服务端通信,执行查询操作。 - **连接管理器**:处理客户端连接请求,验证用户身份等。 - **查询缓存**:用于缓存查询结果,提高查询效率。 - **解析器**:解析SQL语句,将其转换成内部格式。 ...
7. **预处理语句**: 预处理语句( Prepared Statements)是MySQL提供的一种优化机制,允许客户端发送SQL模板,服务器编译后存储,之后多次执行只需发送参数即可,提高了性能和安全性。 8. **事务处理**: MySQL支持...
根据给定文件的信息,我们可以提炼出关于MySQL性能优化的关键知识点,并进行详细阐述: ### 一、MySQL的认识 #### 1.1 架构与组成部分 MySQL作为一款广泛使用的开源关系型数据库管理系统,其架构主要分为客户端和...
在本项目中,"Android 仿QQ客户端及服务端源码" 提供了一套完整的解决方案,用于学习和实践如何构建类似QQ的即时通讯应用。这个项目涵盖了Android客户端开发和服务端架构设计的关键技术,旨在帮助开发者深入理解即时...
在Java中,我们可以使用JDBC(Java Database Connectivity)API来与数据库交互,执行SQL语句进行增删查改操作。 4. **图形用户界面**:客户端和服务端都可能有GUI,以便用户进行交互。Java提供了Swing和JavaFX库来...
- **SQL查询**:编写复杂的SELECT、INSERT、UPDATE、DELETE语句,以及JOIN操作,优化查询性能。 - **事务处理**:了解ACID属性,掌握如何在多表操作中使用事务确保数据一致性。 - **索引优化**:创建合适类型的...
7. **验证安装**:通过命令行工具(如MySQL客户端)连接到新安装的服务器,检查是否能正常运行和执行SQL语句。 请注意,MySQL 5.5已不再受官方支持,因此可能存在安全风险和未修复的漏洞。对于新项目,建议使用更新...
查询的执行流程包括客户端发送 SQL 语句、服务端执行 SQL 语句、服务端返回结果等环节。需要掌握的查询优化技术包括 SQL 语句的优化、查询执行计划的优化、查询结果的缓存等。 MySQL 性能优化需要掌握的技术包括...
首先,我们要理解C/S架构,即客户端-服务器架构,它是分布式应用的基础,其中客户端负责用户界面和与服务器的通信,而服务器端则处理业务逻辑和数据管理。 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希...
这一协议不仅定义了客户端和服务端如何进行握手连接、认证、执行SQL语句等操作,还规范了数据传输的格式以及错误处理机制。了解MySQL通信协议对于深入理解MySQL的工作原理及优化性能具有重要意义。 #### 二、典型的...
服务端的主要任务是处理客户端的请求,执行业务逻辑,如商品的添加、删除、修改,以及用户身份验证等。服务端还需要确保数据的安全性,例如通过HTTPS协议进行加密通信,防止数据泄露。 数据库部分,可能使用MySQL、...
- **SQL语句优化**:合理设计查询语句,减少不必要的全表扫描。 - **索引优化**:合理使用索引,避免过度使用导致的性能下降。 - **参数调整**:根据系统负载调整MySQL配置参数,如缓冲区大小等。 - **硬件优化**:...
而 X 协议是 MySQL 8.0 引入的,它是一个二进制协议,设计为更高效、更安全,支持更多的功能,如分布式事务和多语句执行。 2. **Netty MySQL 编解码器** 在 Netty 中,编解码器是处理输入和输出数据的关键组件。...