临时保存1
This commit is contained in:
132
apply_database_optimization.py
Normal file
132
apply_database_optimization.py
Normal file
@@ -0,0 +1,132 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
数据库性能优化脚本
|
||||
应用索引优化,提升查询性能
|
||||
"""
|
||||
import pymysql
|
||||
import sys
|
||||
import os
|
||||
|
||||
# 设置环境变量
|
||||
os.environ['SECRET_KEY'] = 'dev-key'
|
||||
|
||||
# 直接使用数据库连接字符串
|
||||
DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/pro_db?charset=utf8mb4'
|
||||
|
||||
def apply_database_optimization():
|
||||
"""应用数据库优化"""
|
||||
try:
|
||||
# 解析数据库连接信息
|
||||
db_uri = DATABASE_URI
|
||||
# 从 mysql+pymysql://root:123456@localhost:3306/pro_db?charset=utf8mb4 解析
|
||||
if 'mysql+pymysql://' in db_uri:
|
||||
uri_part = db_uri.replace('mysql+pymysql://', '')
|
||||
auth_host, db_part = uri_part.split('@')
|
||||
username, password = auth_host.split(':')
|
||||
host_port, db_name = db_part.split('/')
|
||||
if ':' in host_port:
|
||||
host, port = host_port.split(':')
|
||||
port = int(port)
|
||||
else:
|
||||
host = host_port
|
||||
port = 3306
|
||||
db_name = db_name.split('?')[0]
|
||||
else:
|
||||
print("❌ 无法解析数据库连接URI")
|
||||
return False
|
||||
|
||||
print(f"🔗 连接数据库: {host}:{port}/{db_name}")
|
||||
|
||||
# 连接数据库
|
||||
conn = pymysql.connect(
|
||||
host=host,
|
||||
port=port,
|
||||
user=username,
|
||||
password=password,
|
||||
database=db_name,
|
||||
charset='utf8mb4'
|
||||
)
|
||||
cursor = conn.cursor()
|
||||
|
||||
print("✅ 数据库连接成功")
|
||||
|
||||
# 执行索引优化
|
||||
optimization_queries = [
|
||||
# 用户表索引
|
||||
"CREATE INDEX IF NOT EXISTS idx_user_created_time ON user(created_time)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_user_status ON user(status)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_user_login_name ON user(login_name)",
|
||||
|
||||
# 提示词表索引
|
||||
"CREATE INDEX IF NOT EXISTS idx_prompt_created_at ON prompt(created_at)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_prompt_user_id ON prompt(user_id)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_prompt_wx_user_id ON prompt(wx_user_id)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_prompt_created_at_user_id ON prompt(created_at, user_id)",
|
||||
|
||||
# 模板表索引
|
||||
"CREATE INDEX IF NOT EXISTS idx_prompt_template_is_default ON prompt_template(is_default)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_prompt_template_category ON prompt_template(category)",
|
||||
|
||||
# 反馈表索引
|
||||
"CREATE INDEX IF NOT EXISTS idx_feedback_created_at ON feedback(created_at)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_feedback_user_id ON feedback(user_id)",
|
||||
|
||||
# 收藏表索引
|
||||
"CREATE INDEX IF NOT EXISTS idx_favorites_created_time ON favorites(created_time)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_favorites_user_id ON favorites(user_id)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_favorites_template_id ON favorites(template_id)",
|
||||
|
||||
# 复合索引优化
|
||||
"CREATE INDEX IF NOT EXISTS idx_prompt_date_user ON prompt(DATE(created_at), user_id)",
|
||||
"CREATE INDEX IF NOT EXISTS idx_user_date_status ON user(DATE(created_time), status)"
|
||||
]
|
||||
|
||||
print("📊 开始创建数据库索引...")
|
||||
|
||||
for i, query in enumerate(optimization_queries, 1):
|
||||
try:
|
||||
cursor.execute(query)
|
||||
print(f"✅ [{i:2d}/{len(optimization_queries)}] 索引创建成功")
|
||||
except Exception as e:
|
||||
if "Duplicate key name" in str(e) or "already exists" in str(e):
|
||||
print(f"ℹ️ [{i:2d}/{len(optimization_queries)}] 索引已存在,跳过")
|
||||
else:
|
||||
print(f"⚠️ [{i:2d}/{len(optimization_queries)}] 索引创建失败: {str(e)}")
|
||||
|
||||
# 提交更改
|
||||
conn.commit()
|
||||
|
||||
# 显示索引信息
|
||||
print("\n📋 当前数据库索引状态:")
|
||||
cursor.execute("SHOW INDEX FROM user")
|
||||
user_indexes = cursor.fetchall()
|
||||
print(f" user表索引数: {len(user_indexes)}")
|
||||
|
||||
cursor.execute("SHOW INDEX FROM prompt")
|
||||
prompt_indexes = cursor.fetchall()
|
||||
print(f" prompt表索引数: {len(prompt_indexes)}")
|
||||
|
||||
cursor.execute("SHOW INDEX FROM prompt_template")
|
||||
template_indexes = cursor.fetchall()
|
||||
print(f" prompt_template表索引数: {len(template_indexes)}")
|
||||
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
print("\n🎉 数据库优化完成!")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 数据库优化失败: {str(e)}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("🚀 开始数据库性能优化...")
|
||||
success = apply_database_optimization()
|
||||
if success:
|
||||
print("✅ 优化成功,现在可以重启应用服务")
|
||||
sys.exit(0)
|
||||
else:
|
||||
print("❌ 优化失败,请检查数据库连接")
|
||||
sys.exit(1)
|
||||
Reference in New Issue
Block a user