MySQL中的in+子查询应该如何优化MySQL 4.1引入了对子查询的支持,即嵌套在其他查询中的查询。
一、为什么需要子查询比如给定一个订单信息查询的场景:
订单存储在两个表中:
对于包含订单号、客户ID、订单日期的每个订单,orders表存储一行。
各订单的物品存储在相关的orderitems表中。
orders表不存储客户信息,它只存储客户的ID。实际的客户信息存储在customers表中。
假如需要列出订购物品TNT2的所有客户,应该怎样检索?
检索包含物品TNT2的所有订单的编号。
检索具有前一步骤列出的订单编号的所有客户的ID。
检索前一步骤返回的所有客户ID的客户信息。
上述每个步骤都可以单独作为一个查询来执行。可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句。
两条SQL如下:
# 检索订单编号,假设检索结果是20005,20007SELECT order_num FROM orderitems WHERE prod_id = 'TNT2';# 检索对应订单编号的客户的id,假设检索结果是10004,10005S ...
Java中的Servlet你了解吗?Servlet详解Servlet是Server + Applet的缩写,表示一个服务器应用。其实,Servlet就是一套规范,我们按照这套规范写出来的代码就可以直接在Java服务器上运行。
Servlet3.1中的Servlet结构如下图所示:
1. Servlet接口说到规范,那当然还是接口最重要了,我们看一下接口的定义:
package javax.servlet;import java.io.IOException;/** * 定义所有servlet必须实现的方法。 * servlet是在Web服务器中运行的小Java程序。servlet通常通过HTTP(超文本传输协议)接收和响应来自Web客户机的请求。 * 要实现这个接口,您可以编写一个扩展javax.servlet.GenericServlet的通用servlet,或者编写一个扩展javax.servlet.http.HttpServlet的HTTP servlet。 * 该接口定义了初始化servlet、服务请求和从服务器中删除servlet的方法。这些被称为生命周期方法,按以下顺序调用 ...
利用Socket动手实现简单HTTP协议一、实现我们知道HTTP协议是在应用层解析内容的,所以我们只需要按照它的报文格式封装和解析数据即可。
关于具体的传输协议,使用的还是Socket,关于Socket,可以移步这篇文章:Java中的Socket你了解吗
这里我将带领大家使用NioServer实现一个简单的HTTP协议,注意,这里主要是出于了解HTTP协议是如何实现的,而不是真正实现一个HTTP协议。
因为HTTP协议是在接收到数据之后才会用到的,所以,我们只需要在Handler处理方法中实现就可以了。
我们首先来看一下效果。
当我们启动程序,然后在浏览器中输入http://localhost:8080/发起请求,这时控制台会打印如下信息:
GET / HTTP/1.1Host: localhost:8080Connection: keep-aliveCache-Control: max-age=0sec-ch-ua: "Not_A Brand";v="8", "Chromium";v="120", &qu ...
Java中的Socket你了解吗?Java中的Socket可以分为普通Socket和NioSocket两种。
1. 普通SocketJava中的网络通信是通过Socket实现的。Socket分为ServerSocket和Socket两大类 。
ServerSocket用于服务端,可以通过accept方法监听请求,监听请求后返回Socket;
Socket用于具体完成数据传输,客户端直接使用Socket发起请求并传输数据;
(1) ServerServerSocket的使用可以分为三步:
**创建ServerSocket**。ServerSocket的构造方法一共有5个,用起来最方便的是ServerSocket(int port),只需要一个port(端口号)即可。
调用创建的ServerSocket的accept方法进行监听。accept方法是阻塞方法,也就是调用该方法后程序会停下来等待连接请求,不会继续执行,当接收到请求后accept方法会返回一个Socket。
使用accept方法返回的Socket与客户端进行通信。
一个ServerSocket简单使用示例
impor ...
系统设计
未读StopWatch使用详解当我们需要测试代码性能的时候,你是否第一时间快速的敲出如下代码:
long start = System.currentTimeMillis(); test(); long end = System.currentTimeMillis(); System.out.println("程序执行耗时:" + (end - start));
这样的写法其实并不会有很大的问题,只是当我们需要测试的方法比较多,或者说交叉测试时,就会比较麻烦了。比如:
long start = System.currentTimeMillis(); test(); long end = System.currentTimeMillis(); long start1 = System.currentTimeMillis(); test1(); long end1 = System.currentTimeMillis(); test2(); long end2 = Syst ...
消息队列
未读RabbitMQ使用篇一、消息队列概述1.1 同步通讯和异步通讯微服务间通讯有同步和异步两种方式:
同步通讯
异步通讯
同步通讯
微服务之间的Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题:
耦合度高:每次加入新的需求,都要修改原来的代码
性能下降:调用者需要等待服务提供者响应,如果调用链过长则响应时间等于每次调用的时间之和
资源浪费:调用链中的每个服务在等待响应过程中,不能释放占用的资源,高并发场景下会极度浪费系统资源
级联失败:如果服务调用者出现问题,所有调用方都会跟着出问题,迅速会导致微服务群故障
异步通讯
异步调用则可以避免上述问题:
我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。
在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。
订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。
为了解除事件发布者与订阅者之间的耦合,两者并不是 ...
Java集合之LinkedList源码篇概述LinkedList使用链表结构存储元素,链表是一种线性的存储结构,将要存储的数据存在一个存储单元中,这个存储单元除了存储的数据意外,还存储下一个存储单元的地址。
LinkedList是双向链表结构,除了存储自身的值之外,还额外存储了前一个和后一个元素的地址。
不过,我们在项目中一般是不会使用到 LinkedList 的,需要用到 LinkedList 的场景几乎都可以使用 ArrayList 来代替,并且,性能通常会更好!就连 LinkedList 的作者约书亚 · 布洛克(Josh Bloch)自己都说从来不会使用 LinkedList 。
底层数据结构public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable{...}
继承AbstractSequentialList, ...
☆* o(≧▽≦)o *☆嗨~我是小奥🍹📄📄📄个人博客:小奥的博客📄📄📄CSDN:个人CSDN📙📙📙Github:传送门📅📅📅面经分享(牛客主页):传送门🍹文章作者技术和水平有限,如果文中出现错误,希望大家多多指正!📜 如果觉得内容还不错,欢迎点赞收藏关注哟! ❤️
Java集合之HashMap源码详解概述HashMap主要用来存放键值对,它基于哈希表的Map接口实现。HashMap的实现是不同步的,说明它不是线程安全的,它的key和value都可以为null。
HashMap JDK1.8之前的底层实现是 数组 + 链表,数组是存储元素的主要部分,链表则是为了解决哈希冲突。
即使哈希函数选择的再好,也很难实现元素百分百均匀分布。当HashMap有大量的元素都存放到一个桶中,这个桶有一个很长的链表,极端情况下HashMap就相当于一条链表,遍历的时间复杂度是O(n),这就完全失去了它的优势。
HashMap JDK1.8之后的底层实现是 数组 + 链表 + 红黑树,桶中的结构可能是链表也可能是红黑树。
当链表长度大于阈值(或者说是红黑树的阈值,默 ...
系统设计
未读大文件分片、秒传、断点续传对于文件上传来说,如果是一个小文件,那么可以直接把文件转化为字节流上传到服务器,但是在文件比较大的情况下,用普通的方式进行上传、下载,都是不可取的,很容易导致内存问题。所以对于大文件来说,采用分片上传,利用多线程并发上传能够达到最大的效率。
具体实现这里不再介绍,有很多优秀的文章可以参考,如下:
大文件上传-分片-秒传-断点续传
实战篇:断点续传?文件秒传?手撸大文件上传 - 掘金 (juejin.cn)
下面我们简要介绍实现功能的逻辑以及存在的问题如何解决。
分片上传将大文件切分为多个小的数据块(通常大小为1MB~10MB),然后将这些小数据块分别上传至服务器,最后由服务器将这些小块组合成完整的文件。这种方式可以避免由于网络中断或超时而导致上传失败,并且能够更好地控制上传进度。
分片上传逻辑
客户端将文件切成固定大小的块(例如每个块的大小为1MB),并为每个块生成唯一的标识符。
客户端逐个上传每个块到服务器。上传时,客户端将块的标识符和块数据一起发送给服务器。
服务器接收到每个块后,会将块数据存储到临时文件中,并在服务器端记录每个块的标识符和位置。 ...
算法模板排序算法十大排序算法指的是在计算机科学中被广泛使用,效率较高且实现简单的十个排序算法。下面是这十种排序算法的简要介绍:
(1)冒泡排序(Bubble Sort):交换相邻元素,最大或最小的元素经过n-1次比较后,就会排在数组的最后一位。
(2)选择排序(Selection Sort):每次寻找未排序序列中的最小值,并将其放在已排序序列的末尾。
(3)插入排序(Insertion Sort):对于未排序序列中的每一个元素,将其插入到已排序序列中的合适位置。
(4)希尔排序(Shell Sort):采用分组策略,先将待排序序列拆分为n/2个子序列,进行插入排序,然后逐渐缩小子序列的长度,直到子序列长度为1,即完成排序。
(5)归并排序(Merge Sort):将待排序序列不断二分,再将两个有序的子序列合并为一个有序序列,重复上述步骤,直到整个序列有序。
(6)快速排序(Quick Sort):选择一个基准元素,将序列中小于它的元素放在它的左边,大于它的元素放在右边,然后递归地对左右子序列进行快速排序。
(7)堆排序(Heap Sort):将待排序序列构建成一个堆,然后不断 ...