单工:
在两台计算机通信的时候,数据的传输是单向的。生活中的类比:遥控器。
半双工:
在两台计算机之间,数据传输是双向的,你可以给我发送,我也可以给你发送,但是在这个通讯连接里面,同一时间只能有一台服务器在发送数据,也就是你要给我发的话,也必须等我发给你完了之后才能给我发。生活中的类比:对讲机。
全双工:
数据的传输是双向的,并且可以同时传输。生活中的类比:打电话。
MySQL 使用了半双工的通信方式?
要么是客户端向服务端发送数据,要么是服务端向客户端发送数据,这两个动作不能同时发生。所以客户端发送SQL 语句给服务端的时候,(在一次连接里面)数据是不能分成小块发送的,不管你的SQL 语句有多大,都是一次性发送。
比如我们用MyBatis 动态SQL 生成了一个批量插入的语句,插入10 万条数据,values后面跟了一长串的内容,或者where 条件in 里面的值太多,会出现问题。
这个时候我们必须要调整MySQL 服务器配置max_allowed_packet 参数的值(默认是4M),把它调大,否则就会报错。
另一方面,对于服务端来说,也是一次性发送所有的数据,不能因为你已经取到了想要的数据就中断操作,这个时候会对网络和内存产生大量消耗。
所以,我们一定要在程序里面避免不带limit 的这种操作,比如一次把所有满足条件的数据全部查出来,一定要先count 一下。如果数据量的话,可以分批查询。
执行一条查询语句,客户端跟服务端建立连接之后呢?下一步要做什么?