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在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)