一、子查询统计
MySQL数据库也是客户端/服务端通信协议的模式,在任意时刻,无非就是要么客户端向服务端发送请求,要么服务端向客户端响应查询结果,这两个动作不能同时发生。一旦一端开始发送消息,另一端要接收完整个消息才能响应它,所以我们无法将一个请求消息切成小块独立发送,也没有办法进行流量控制
当客户端向服务端发送sql语句时,首先客户端会把查询语句做成一个单独的数据包发送给服务端,这时如果查询语句很长则需要设置参数,如果实在太大,服务端可能会拒绝接受更多数据并抛出异常。
同理,与之相反的是服务端从存储引擎中拿到数据后响应给客户端,这时服务端响应的数据可能会很多,无法将这些数据做成一个数据包,可能会做成多个数据包。但是当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。因而在实际开发中,尽量保持查询简单且只返回必需的数据,减小通信间数据包的大小和数量是一个非常好的习惯,这也是查询中尽量避免使用SELECT *以及加上LIMIT限制的原因之一。
2、查询时尽量使用limit做限制查询,原因上面已经分析,服务端可能会响应大量的数据包给客户端,我们通常只拿到前几条数据,后面的数据如果需要,则可以使用分页查询,边用边查。
3、还有一个误区就是,当我们在设计表结构时,尽量将字段的数据类型设置到最小,够用就行,别瞻前顾后,就拿int类型来说吧,我们习惯将给int类型的字段设置长度,其实吧,你设置不设置都没什么卵用,int类型是采用16位存储空间,那么它的存储范围就已经确定,所以int(1)和int(20)对于存储和计算是相同的,大家改改吧,我也是刚学到的。
4、我们在查询数据库,可能会用多个范围条件来作限制,比如查询某一时间段内入职的某一年龄段的员工,此时需要接纳的一点是,MySQL无法同时使用俩个字段的索引,它只会选择一种的一个字段的索引来做查询。
5、建议大家经常把表中一些不常用的索引删掉,定期删除一些长时间未使用过的索引是一个非常好的习惯。(在这儿给大家嘱咐一下,不要认为索引就是查询最好的工具,如果有时候查询非常小的表时,建议不要建立索引,直接全表扫描效果会更好)。