Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

240207笔记:快手Java一面 #12

Open
Geekiter opened this issue Feb 7, 2024 · 0 comments
Open

240207笔记:快手Java一面 #12

Geekiter opened this issue Feb 7, 2024 · 0 comments

Comments

@Geekiter
Copy link
Owner

Geekiter commented Feb 7, 2024

MySQL最左匹配

在MySQL中,"最左匹配"是指在多列索引中,MySQL只能利用索引的最左边的部分列进行索引查找。这意味着如果你有一个多列索引(比如(a,b,c)),那么MySQL只能有效地使用前面的列(a),而不能有效地使用后面的列(b,c)进行索引查找。

例如,如果你有一个索引 (a, b, c),并且查询条件中只包含列 a,那么MySQL可以使用这个索引进行查找。但是如果查询条件中包含列 b 或者列 c,那么MySQL将无法有效地使用这个索引,而会退化为全表扫描。

因此,在设计索引时,要考虑到最常用的查询条件,并尽量将这些条件放在索引的最左边,以便MySQL能够有效地利用索引进行查询,从而提高查询性能。

好的,让我为你提供一个简单的示例来说明最左匹配。假设我们有一个表 user_info,包含三个列:idusernameemail。我们希望通过 usernameemail 进行查询。

首先,我们创建一个示例表并添加一些数据:

CREATE TABLE user_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50),
    email VARCHAR(100)
);

INSERT INTO user_info (username, email) VALUES
('user1', 'user1@example.com'),
('user2', 'user2@example.com'),
('user3', 'user3@example.com');

接下来,我们添加一个多列索引,其中包括 usernameemail 列:

CREATE INDEX idx_username_email ON user_info (username, email);

现在,让我们来执行几个查询,并观察 MySQL 如何使用索引:

  1. 使用 username 进行查询:
EXPLAIN SELECT * FROM user_info WHERE username = 'user1';

解释计划会显示 MySQL 使用了索引 idx_username_email 进行查询。

  1. 使用 email 进行查询:
EXPLAIN SELECT * FROM user_info WHERE email = 'user2@example.com';

解释计划同样显示 MySQL 使用了索引 idx_username_email 进行查询。

  1. 使用 usernameemail 两个条件进行查询:
EXPLAIN SELECT * FROM user_info WHERE username = 'user1' AND email = 'user1@example.com';

解释计划还是显示 MySQL 使用了索引 idx_username_email 进行查询。

以上就是最左匹配的示例。MySQL 能够有效地使用索引来支持单列查询和最左边的列组合查询,但是当查询中涉及到不在索引的最左边的列时,MySQL 将无法使用这个索引进行查询优化。

好的,让我们来举一个反面的例子,展示当查询条件中不使用索引的最左列时,MySQL 无法有效地使用索引的情况。

假设我们有同样的 user_info 表,但是我们创建了一个反向顺序的索引,将 email 放在了前面,username 放在了后面:

CREATE INDEX idx_email_username ON user_info (email, username);

现在,我们尝试使用 username 进行查询:

EXPLAIN SELECT * FROM user_info WHERE username = 'user1';

即使我们已经创建了索引,MySQL 也将无法使用这个索引进行查询优化,因为查询条件中使用的是索引的第二列而不是第一列。解释计划可能会显示 MySQL 将执行全表扫描来获取结果。

这就是一个反面的例子,说明了当查询条件中不使用索引的最左列时,MySQL 无法有效地利用索引进行查询优化的情况。因此,在设计索引时,要考虑到最常用的查询条件,并尽量将这些条件放在索引的最左边。

TCP 3次握手

  1. client send syn signal
  2. server send syn/ack
  3. client发送ack

TCP 4次挥手

  1. a send fin
  2. b send ack
  3. b send fin
  4. a send ack

HTTP和RPC的区别

设计目的

http主要用于客户端和服务器之间的传输协议,rpc目的是让远程计算机程序调用更像本地调用,使客户端能够调用远程服务器的函数或方法。

通信方式

  • http基于请求-响应模型,通常使用http方法和状态码来实现通信
  • rpc采用远程过程调用的方法,rpc框架通常隐藏底层细节。

数据格式

  • http通常使用文本格式,html、json、xml等
  • rpc更灵活,可以使用二进制格式,比如protocol buffers、json-rpc

状态管理

  • http是无状态管理,保持独立性,服务器不保留客户端状态信息
  • rpc同通过一些机制保持状态,比如session或者传递上下文信息

应用场景

  • http庸才web程序、b/s架构,restful api服务
  • rpc用于分布式系统、微服务架构

示例

http:

下面是一个简单的示例,演示了使用HTTP和RPC在Python中实现远程调用的不同方式:

HTTP 示例:

# 服务器端
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/add', methods=['POST'])
def add():
    data = request.get_json()
    num1 = data['num1']
    num2 = data['num2']
    result = num1 + num2
    return jsonify({'result': result})

if __name__ == '__main__':
    app.run()

# 客户端
import requests

def add(num1, num2):
    url = 'http://localhost:5000/add'
    data = {'num1': num1, 'num2': num2}
    response = requests.post(url, json=data)
    result = response.json()['result']
    return result

print(add(3, 5))  # 输出 8

RPC 示例:

# 服务器端
from xmlrpc.server import SimpleXMLRPCServer

def add(num1, num2):
    return num1 + num2

server = SimpleXMLRPCServer(('localhost', 8000))
server.register_function(add, 'add')
server.serve_forever()

# 客户端
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
result = proxy.add(3, 5)
print(result)  # 输出 8

在这两个示例中,服务器端分别提供了一个函数用于计算两个数的和。对于HTTP示例,客户端使用POST请求将数据发送到服务器,服务器返回结果。而对于RPC示例,客户端直接调用服务器端注册的函数,就像调用本地函数一样。
rpc:

# 服务器端
from xmlrpc.server import SimpleXMLRPCServer

def add(num1, num2):
    return num1 + num2

server = SimpleXMLRPCServer(('localhost', 8000))
server.register_function(add, 'add')
server.serve_forever()

# 客户端
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
result = proxy.add(3, 5)
print(result)  # 输出 8

# practice
from xmlrpc.server import SimpleXMLRPCServer

def add(num1, num2):
	return num1 + num2

server = SimpleXMLRPCServer(('localhost', 8000))
server.register_function(add, "add")
server.serve_forever()

# client
import xmlrpc.client

proxy = xmlrpc.client.ServerProxy("http://localhost:8000/")
result = proxy.add(3, 5)
print(result)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant