django的db性能调优

构建一个user_demo表

ini 复制代码
from django.db import models

class UserInfo(models.Model):
    # 1. 基础字段
    username = models.CharField(max_length=50, unique=True)
    # 给 email 一个默认空字符串,或者设为 null=True,防止迁移报错
    email = models.EmailField(default='') 

    # 2. 状态字段
    status = models.SmallIntegerField(default=1, help_text="0:Inactive, 1:Active, 2:Banned")
    role = models.CharField(max_length=10, default='member')

    # 3. 数值字段
    age = models.PositiveSmallIntegerField(null=True)
    balance = models.DecimalField(max_digits=19, decimal_places=4, default=0.0000)
    score = models.IntegerField(default=0)

    # 4. 时间字段
    # 使用 auto_now_add=True 让 Django 自动处理创建时间
    created_at = models.DateTimeField(auto_now_add=True) 
    last_login = models.DateTimeField(null=True, blank=True)

    # 5. 大文本/复杂字段
    bio = models.TextField(null=True, blank=True)
    
    # 6. JSON 字段
    extras = models.JSONField(default=dict, null=True, blank=True)

    class Meta:
        db_table = 'user_demo'

迁移

复制代码
python manage.py makemigration
python manage.py migrate

使用bulk_create创建1万条数据

python 复制代码
import os
import sys
import random
import string
import django

# 1. 设置 Django 环境
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()

from main.models import UserInfo

def generate_random_string(length=10):
    """生成随机字符串"""
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(length))

def create_demo_data(count=100):
    print(f"开始生成 {count} 条数据...")
    
    users = []
    # 预先定义好 choices,模拟真实数据分布
    ROLES = ['admin', 'editor', 'member', 'guest']
    
    for i in range(count):
        # 确保 username 唯一,这里简单加上索引 i
        username = f"user_{generate_random_string(5)}_{i}"
        
        user = UserInfo(
            username=username,
            email=f"{username}@example.com",
            status=random.choice([0, 1, 1, 1, 2]), # 1 的概率大一些
            role=random.choice(ROLES),
            age=random.randint(18, 80),
            balance=random.uniform(0, 100000),
            score=random.randint(0, 500000),
            bio=generate_random_string(500),
            extras={'preference': random.choice(['light', 'dark']), 'level': random.randint(1, 10)}
        )
        users.append(user)

    # bulk_create 一次性插入,性能更好
    UserInfo.objects.bulk_create(users)
    print(f"✅ 成功插入 {len(users)} 条数据到 UserInfo 表。")

if __name__ == "__main__":
    try:
        create_demo_data(1000000)
    except Exception as e:
        print(f"❌ 发生错误: {e}")

创建成功

sql 复制代码
mysql> select count(*) from user_demo;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.002 sec)

构建10万条失败,失败信息为:

vbnet 复制代码
开始生成 1000000 条数据...
❌ 发生错误: (2013, 'Lost connection to MySQL server during query')

采取分批插入的方式来解决问题

python 复制代码
import os
import sys
import random
import string
import django

# 1. 设置 Django 环境
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()

from main.models import UserInfo

def generate_random_string(length=10):
    """生成随机字符串"""
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for i in range(length))

def create_demo_data(count=100):
    print(f"开始生成 {count} 条数据...")
    
    users = []
    BATCH_SIZE = 5000  # 每次插入 5000 条
    # 预先定义好 choices,模拟真实数据分布
    ROLES = ['admin', 'editor', 'member', 'guest']
    batch_data = []
    for i in range(count):
        # 确保 username 唯一,这里简单加上索引 i
        username = f"user_{generate_random_string(5)}_{i}"
        
        user = UserInfo(
            username=username,
            email=f"{username}@example.com",
            status=random.choice([0, 1, 1, 1, 2]), # 1 的概率大一些
            role=random.choice(ROLES),
            age=random.randint(18, 80),
            balance=random.uniform(0, 100000),
            score=random.randint(0, 500000),
            bio=generate_random_string(500),
            extras={'preference': random.choice(['light', 'dark']), 'level': random.randint(1, 10)}
        )

        batch_data.append(user)
        # 当积攒够了 BATCH_SIZE,就插入一次
        if len(batch_data) >= BATCH_SIZE:
            UserInfo.objects.bulk_create(batch_data, batch_size=BATCH_SIZE)
            print(f"已插入 {i + 1} 条...")
            batch_data = [] # 清空列表

    # 插入剩余的数据(如果有的话)
    if batch_data:
        UserInfo.objects.bulk_create(batch_data)
        print(f"已插入剩余 {len(batch_data)} 条...")
    print(f"✅ 成功插入 {len(users)} 条数据到 UserInfo 表。")

if __name__ == "__main__":
    try:
        create_demo_data(1000000)
    except Exception as e:
        print(f"❌ 发生错误: {e}")
相关推荐
vx_biyesheji000114 小时前
计算机毕业设计:Python多源新闻数据智能舆情挖掘平台 Flask框架 爬虫 SnowNLP ARIMA 可视化 数据分析 大数据(建议收藏)✅
爬虫·python·机器学习·数据分析·django·flask·课程设计
Mr数据杨14 小时前
【Dv3Admin】Django一键配置权限规则
python·django·sqlite
小陈工15 小时前
2026年3月22日技术资讯洞察:数据库优化进入预测时代,网络安全威胁全面升级
java·开发语言·数据库·python·安全·web安全·django
vx_biyesheji000117 小时前
计算机毕业设计:Python全栈图书数据挖掘与可视化看板 Django框架 爬虫 当当图书 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
爬虫·python·机器学习·数据挖掘·django·毕业设计·课程设计
B站_计算机毕业设计之家1 天前
计算机毕业设计:Python当当网图书数据全链路处理平台 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
爬虫·python·机器学习·django·flask·pandas·课程设计
q_35488851531 天前
计算机毕业设计:Python当当网图书大数据分析平台 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
大数据·爬虫·python·机器学习·数据分析·django·课程设计
q_35488851532 天前
计算机毕业设计源码:Python动漫智能推荐与可视化分析系统 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型(建议收藏)✅
python·scrapy·数据分析·django·课程设计·旅游·推荐算法
B站计算机毕业设计之家2 天前
Python 基于协同过滤的动漫推荐与数据分析平台 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型 计算机毕业设计(建议收藏)✅
大数据·python·scrapy·数据分析·django·课程设计·推荐算法
B站计算机毕业设计之家2 天前
计算机毕业设计源码:Python图书数据智能采集与可视化大屏 当当网 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
爬虫·python·机器学习·信息可视化·django·pandas·课程设计
小陈工2 天前
FastAPI性能优化实战:从每秒100请求到1000的踩坑记录
python·性能优化·django·flask·numpy·pandas·fastapi