133 lines
5.0 KiB
Python
133 lines
5.0 KiB
Python
#!/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)
|