`
风雪涟漪
  • 浏览: 508673 次
  • 性别: Icon_minigender_1
  • 来自: 大连->北京
博客专栏
952ab666-b589-3ca9-8be6-3772bb8d36d4
搜索引擎基础(Search...
浏览量:9069
Ae468720-c1b2-3218-bad0-65e2f3d5477e
SEO策略
浏览量:18484
社区版块
存档分类
最新评论

查询性能的优化 - 语句执行的基础 - MySQL 客户端/服务端 协议

阅读更多

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服务端和客户端.zip

    MySQL客户端工具用于与服务端交互,执行SQL语句,管理和维护数据库。压缩包中提供了两种客户端工具:mysql-workbench和Navicat Lite for MySQL。 1. **mysql-workbench**:是MySQL官方出品的图形化管理工具,支持...

    Mysql客户端服务端安装包

    7. 性能优化:为了确保MySQL服务器的高效运行,你还需要关注性能优化,比如调整内存设置、使用索引、优化查询语句等。 8. 安全性:为了保护数据库免受攻击,你需要定期更新MySQL到最新版本,限制不必要的网络访问,...

    mysql 服务端和客户端

    除此之外,还有许多图形化的MySQL客户端工具,如MySQL Workbench、Navicat、phpMyAdmin等,它们提供了更直观的界面和丰富的功能,适合不熟悉命令行或者需要更高效管理数据库的用户。如果对MySQL自带的客户端不习惯,...

    易语言客户端与服务端连接

    服务端可能通过执行SQL语句来读写数据,满足客户端的需求。 4. **通信协议**:“接发包”这个文件夹可能包含了关于数据包的发送和接收的实现,这是客户端和服务端之间通信的基础。数据包通常包含了请求信息、状态...

    MySQL5.5服务端+MySQL-Front客户端.zip

    - 复杂查询优化:改进了查询优化器,处理复杂SQL语句的能力更强。 2. MySQL-Front客户端: - 图形化界面:为用户提供直观的界面,使得数据库管理变得更加简单。 - 数据操作:支持创建、修改、删除数据库表,以及...

    易语言MYSQL客户端源码,易语言MYSQL服务端源码,易语言MYSQL网络

    本压缩包包含的“易语言MYSQL客户端源码”和“易语言MYSQL服务端源码”是基于易语言实现的MySQL数据库的网络通信解决方案。 首先,我们要理解MySQL是一种广泛使用的开源关系型数据库管理系统,它具有高效、稳定和...

    聊天软件客户端加服务端以及sql数据库

    4. **MySQL数据库操作**:包括创建表,插入、查询、更新和删除数据,事务处理,以及优化查询性能等。 5. **Android网络编程**:使用HttpURLConnection或者OkHttp等库进行网络请求,处理异步任务,确保用户界面的...

    MySQL架构演变与性能优化最终版

    客户端通过网络与MySQL服务端通信,执行查询操作。 - **连接管理器**:处理客户端连接请求,验证用户身份等。 - **查询缓存**:用于缓存查询结果,提高查询效率。 - **解析器**:解析SQL语句,将其转换成内部格式。 ...

    学习mysql服务端协议.zip

    7. **预处理语句**: 预处理语句( Prepared Statements)是MySQL提供的一种优化机制,允许客户端发送SQL模板,服务器编译后存储,之后多次执行只需发送参数即可,提高了性能和安全性。 8. **事务处理**: MySQL支持...

    mysql性能优化篇-自己的理解

    根据给定文件的信息,我们可以提炼出关于MySQL性能优化的关键知识点,并进行详细阐述: ### 一、MySQL的认识 #### 1.1 架构与组成部分 MySQL作为一款广泛使用的开源关系型数据库管理系统,其架构主要分为客户端和...

    Android 仿QQ客户端及服务端源码

    在本项目中,"Android 仿QQ客户端及服务端源码" 提供了一套完整的解决方案,用于学习和实践如何构建类似QQ的即时通讯应用。这个项目涵盖了Android客户端开发和服务端架构设计的关键技术,旨在帮助开发者深入理解即时...

    TCP网络编程简单聊天窗口(登录,注册,客户端和服务端图形界面和数据库)适合新手当作业或学习

    在Java中,我们可以使用JDBC(Java Database Connectivity)API来与数据库交互,执行SQL语句进行增删查改操作。 4. **图形用户界面**:客户端和服务端都可能有GUI,以便用户进行交互。Java提供了Swing和JavaFX库来...

    Android购物商城源码客户端+服务端+数据库

    - **SQL查询**:编写复杂的SELECT、INSERT、UPDATE、DELETE语句,以及JOIN操作,优化查询性能。 - **事务处理**:了解ACID属性,掌握如何在多表操作中使用事务确保数据一致性。 - **索引优化**:创建合适类型的...

    mysql-5.5服务端安装包64位

    7. **验证安装**:通过命令行工具(如MySQL客户端)连接到新安装的服务器,检查是否能正常运行和执行SQL语句。 请注意,MySQL 5.5已不再受官方支持,因此可能存在安全风险和未修复的漏洞。对于新项目,建议使用更新...

    mysql深度学习者 MySQL性能优化总结

    查询的执行流程包括客户端发送 SQL 语句、服务端执行 SQL 语句、服务端返回结果等环节。需要掌握的查询优化技术包括 SQL 语句的优化、查询执行计划的优化、查询结果的缓存等。 MySQL 性能优化需要掌握的技术包括...

    Qt实现客户端/服务器端登录验证.数据传输使用md5加密

    首先,我们要理解C/S架构,即客户端-服务器架构,它是分布式应用的基础,其中客户端负责用户界面和与服务器的通信,而服务器端则处理业务逻辑和数据管理。 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希...

    MySQL通讯协议分析

    这一协议不仅定义了客户端和服务端如何进行握手连接、认证、执行SQL语句等操作,还规范了数据传输的格式以及错误处理机制。了解MySQL通信协议对于深入理解MySQL的工作原理及优化性能具有重要意义。 #### 二、典型的...

    Android应用源码基于安卓的校园二手交易系统客户端+服务端+数据库

    服务端的主要任务是处理客户端的请求,执行业务逻辑,如商品的添加、删除、修改,以及用户身份验证等。服务端还需要确保数据的安全性,例如通过HTTPS协议进行加密通信,防止数据泄露。 数据库部分,可能使用MySQL、...

    MySQL-进阶.pdf

    - **SQL语句优化**:合理设计查询语句,减少不必要的全表扫描。 - **索引优化**:合理使用索引,避免过度使用导致的性能下降。 - **参数调整**:根据系统负载调整MySQL配置参数,如缓冲区大小等。 - **硬件优化**:...

    mysql 服务端 加客服端

    - **MySQL Server**:这是MySQL的核心组件,负责处理来自客户端的所有请求,执行SQL查询,并返回结果。它包含了数据库引擎、存储过程、触发器等核心功能。 - **MySQL Server配置**:安装后,你需要根据服务器环境...

Global site tag (gtag.js) - Google Analytics