最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談django的db性能調(diào)優(yōu)

 更新時間:2026年02月04日 10:09:39   作者:哈里謝頓  
本文主要介紹了淺談django的db性能調(diào)優(yōu),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1 環(huán)境準備

構(gòu)建一個user_demo表

from django.db import models

class UserInfo(models.Model):
    # 1. 基礎(chǔ)字段
    username = models.CharField(max_length=50, unique=True)
    # 給 email 一個默認空字符串,或者設為 null=True,防止遷移報錯
    email = models.EmailField(default='') 

    # 2. 狀態(tài)字段
    status = models.SmallIntegerField(default=1, help_text="0:Inactive, 1:Active, 2:Banned")
    role = models.CharField(max_length=10, default='member')

    # 3. 數(shù)值字段
    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 自動處理創(chuàng)建時間
    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

2 創(chuàng)建調(diào)優(yōu)

使用bulk_create創(chuàng)建1萬條數(shù)據(jù)

import os
import sys
import random
import string
import django

# 1. 設置 Django 環(huán)境
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} 條數(shù)據(jù)...")
    
    users = []
    # 預先定義好 choices,模擬真實數(shù)據(jù)分布
    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)} 條數(shù)據(jù)到 UserInfo 表。")

if __name__ == "__main__":
    try:
        create_demo_data(1000000)
    except Exception as e:
        print(f"? 發(fā)生錯誤: {e}")

創(chuàng)建成功

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

構(gòu)建10萬條失敗,失敗信息為:

開始生成 1000000 條數(shù)據(jù)...
? 發(fā)生錯誤: (2013, 'Lost connection to MySQL server during query')

采取分批插入的方式來解決問題

import os
import sys
import random
import string
import django

# 1. 設置 Django 環(huán)境
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} 條數(shù)據(jù)...")
    
    users = []
    BATCH_SIZE = 5000  # 每次插入 5000 條
    # 預先定義好 choices,模擬真實數(shù)據(jù)分布
    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 = [] # 清空列表

    # 插入剩余的數(shù)據(jù)(如果有的話)
    if batch_data:
        UserInfo.objects.bulk_create(batch_data)
        print(f"已插入剩余 {len(batch_data)} 條...")
    print(f"? 成功插入 {len(users)} 條數(shù)據(jù)到 UserInfo 表。")

if __name__ == "__main__":
    try:
        create_demo_data(1000000)
    except Exception as e:
        print(f"? 發(fā)生錯誤: {e}")

3 查找優(yōu)化

這種查找,性能非常操作,因為本質(zhì)上是在做:SELECT * FROM table ...

from main.models import UserInfo

users = UserInfo.objects.all()
users_usernames = [user.username for user in users]

改成

from main.models import UserInfo

users_usernames = list(UserInfo.objects.values_list('username', flat=True))

到此這篇關(guān)于淺談django的db性能調(diào)優(yōu)的文章就介紹到這了,更多相關(guān)django db性能調(diào)優(yōu)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python學習之SpaCy庫的高級特性詳解

    python學習之SpaCy庫的高級特性詳解

    在之前的文章中,我們介紹了SpaCy庫的一些基本概念和功能,在這篇文章中,我們將深入學習一些更高級的特性,包括詞向量、依賴性解析、和自定義組件
    2023-07-07
  • Python中 CSV格式清洗與轉(zhuǎn)換的實例代碼

    Python中 CSV格式清洗與轉(zhuǎn)換的實例代碼

    這篇文章主要介紹了Python123 CSV格式清洗與轉(zhuǎn)換的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • 使用numpy和PIL進行簡單的圖像處理方法

    使用numpy和PIL進行簡單的圖像處理方法

    今天小編就為大家分享一篇使用numpy和PIL進行簡單的圖像處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python解壓zip文件名亂碼問題的具體分析和解決方案

    Python解壓zip文件名亂碼問題的具體分析和解決方案

    使用Python處理含有中文文件名的壓縮文件時,這些中文文件名會出現(xiàn)亂碼,今天我們就來看一下如何來解決這個亂碼的問題,以下是具體分析和解決方案,需要的朋友可以參考下
    2025-09-09
  • python讀寫csv文件實例代碼

    python讀寫csv文件實例代碼

    在本篇文章中小編給各位分享了關(guān)于python讀取和寫入csv文件的知識點以及實例代碼,需要的朋友們參考下。
    2019-07-07
  • Python 彈窗設計小人發(fā)射愛心

    Python 彈窗設計小人發(fā)射愛心

    今天小編就為大家分享一篇使用Python畫出小人發(fā)射愛心的代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-09-09
  • Python中使用gzip模塊壓縮文件的簡單教程

    Python中使用gzip模塊壓縮文件的簡單教程

    這篇文章主要介紹了Python中使用gzip模塊壓縮文件的簡單教程,本文的例子主要針對類UNIXZ系統(tǒng),需要的朋友可以參考下
    2015-04-04
  • python模塊詳解之pywin32使用文檔(python操作windowsAPI)

    python模塊詳解之pywin32使用文檔(python操作windowsAPI)

    pywin32是一個第三方模塊庫,主要的作用是方便python開發(fā)者快速調(diào)用windows API的一個模塊庫,這篇文章主要給大家介紹了關(guān)于python模塊詳解之pywin32使用文檔的相關(guān)資料,文中將python操作windowsAPI介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • python+tkinter可視化GUI方式

    python+tkinter可視化GUI方式

    文章介紹了使用Python的tkinter庫創(chuàng)建GUI窗口的過程,包括窗口和標簽的定義、Entry和Text控件的基本屬性和使用方法、網(wǎng)格布局的應用、按鈕綁定事件和彈窗的使用、Combox下拉框的添加、控件屬性值的獲取和更改,以及tkinter自帶的剪切板操作
    2026-04-04
  • 在Pycharm中將pyinstaller加入External Tools的方法

    在Pycharm中將pyinstaller加入External Tools的方法

    今天小編就為大家分享一篇在Pycharm中將pyinstaller加入External Tools的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評論

准格尔旗| 桐庐县| 什邡市| 洛扎县| 安宁市| 灵石县| 大丰市| 贵德县| 罗定市| 峡江县| 昭苏县| 屯昌县| 集贤县| 泗阳县| 永昌县| 西林县| 江北区| 巫溪县| 名山县| 明水县| 吴旗县| 类乌齐县| 丘北县| 嘉鱼县| 铜山县| 鄂尔多斯市| 湖南省| 绵阳市| 夹江县| 甘谷县| 平乐县| 和平区| 建平县| 巴塘县| 西昌市| 通江县| 横峰县| 吉水县| 崇义县| 锡林浩特市| 含山县|