Python代码实现
import mysql.connector
# 连接数据库
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="yourdatabase"
)
mycursor = mydb.cursor()
# 执行查询
query = """
SELECT table1.*, table2.*, table3.*
FROM table1
JOIN table2 ON table1.id = table2.id
JOIN table3 ON table2.parent_id = table3.parent_id
WHERE table1.category = 'important' AND table3.status = 'active'
"""
mycursor.execute(query)
result = mycursor.fetchall()
for row in result:
print(row)
# 关闭连接
mycursor.close()
mydb.close()
性能优化手段
- 索引优化:
- 在
table1
表的 category
字段上创建索引:
CREATE INDEX idx_table1_category ON table1(category);
- 在 `table3` 表的 `status` 字段上创建索引:
CREATE INDEX idx_table3_status ON table3(status);
- 由于存在关联,在 `table2` 的 `id` 字段和 `parent_id` 字段上也应该确保有索引(通常在创建外键时会自动创建),如果没有则创建:
CREATE INDEX idx_table2_id ON table2(id);
CREATE INDEX idx_table2_parent_id ON table2(parent_id);
- 查询语句优化:
- 确保
JOIN
条件使用的字段类型一致,避免隐式类型转换导致索引失效。
- 尽量使用
INNER JOIN
而不是 LEFT JOIN
或 RIGHT JOIN
,如果查询语义允许,因为 INNER JOIN
执行效率更高。
- 只选择需要的字段,而不是使用
*
。例如,如果只需要 table1
的 name
字段,table2
的 description
字段和 table3
的 created_at
字段,可以这样写查询:
SELECT table1.name, table2.description, table3.created_at
FROM table1
JOIN table2 ON table1.id = table2.id
JOIN table3 ON table2.parent_id = table3.parent_id
WHERE table1.category = 'important' AND table3.status = 'active'
- 数据库配置优化:
- 适当增加
innodb_buffer_pool_size
,让更多的数据可以缓存到内存中,减少磁盘 I/O。
- 调整
innodb_log_file_size
等日志相关参数,优化写入性能。