MySQL最左匹配
在MySQL中,"最左匹配"是指在多列索引中,MySQL只能利用索引的最左边的部分列进行索引查找。这意味着如果你有一个多列索引(比如(a,b,c)),那么MySQL只能有效地使用前面的列(a),而不能有效地使用后面的列(b,c)进行索引查找。
例如,如果你有一个索引 (a, b, c),并且查询条件中只包含列 a,那么MySQL可以使用这个索引进行查找。但是如果查询条件中包含列 b 或者列 c,那么MySQL将无法有效地使用这个索引,而会退化为全表扫描。
因此,在设计索引时,要考虑到最常用的查询条件,并尽量将这些条件放在索引的最左边,以便MySQL能够有效地利用索引进行查询,从而提高查询性能。
好的,让我为你提供一个简单的示例来说明最左匹配。假设我们有一个表 user_info
,包含三个列:id
、username
和 email
。我们希望通过 username
和 email
进行查询。
首先,我们创建一个示例表并添加一些数据:
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');
接下来,我们添加一个多列索引,其中包括 username
和 email
列:
CREATE INDEX idx_username_email ON user_info (username, email);
现在,让我们来执行几个查询,并观察 MySQL 如何使用索引:
- 使用
username
进行查询:
EXPLAIN SELECT * FROM user_info WHERE username = 'user1';
解释计划会显示 MySQL 使用了索引 idx_username_email
进行查询。
- 使用
email
进行查询:
EXPLAIN SELECT * FROM user_info WHERE email = 'user2@example.com';
解释计划同样显示 MySQL 使用了索引 idx_username_email
进行查询。
- 使用
username
和email
两个条件进行查询:
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次握手
- client send syn signal
- server send syn/ack
- client发送ack
TCP 4次挥手
- a send fin
- b send ack
- b send fin
- 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)