为什么 django 通过 queryset 的一次简单数据库操作花费时间那么长?

clipboard.png

如图所示,简单的增和查操作,花费时间长达1秒 [环境:windows + python3 + django2 ]。(PS:数据量也不多,todo_list 只有2行数据,依然这么慢)

def get(request):
    # /todo/list 接口处理函数
    todo_list = list( Todo.objects.all().values('name') )

    return JsonResponse({
        'code': 0,
        'data':   todo_list
    })

@post_method
def add(request):
    # /todo/add 接口处理函数
    item = Todo.objects.create(name=request.POST['name'])
    return JsonResponse({
        'code': 0,
        'msg': 'add successfully.'
    })

数据库用的mysql, 用默认的 sqlite3 的话则不会那么慢

# settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'ops_chart',
        'USER': 'root',
        'PASSWORD': 'xxxxxx',
        'HOST': 'localhost',
        'PORT': '3306',

        'OPTIONS': {
            'sql_mode': 'STRICT_TRANS_TABLES'
        }
    }
}
阅读 4.6k
4 个回答

说是数据库操作慢,你连用的是啥数据库也不交代一下吗?

刚看到,是mysql;直接访问一下呢,看看对比如何?

调试过,发现sql语句执行的耗时并不长。
后来发现,

连接 windows 的mysql服务会很慢(1s左右),
连接 linux 的mysql服务就在正常范畴内了(100ms左右)。

问题解决,但原因未明。难道是与windows本地的mysql服务建立连接会比较慢?

一般像django和java的hibernate有些相似,它并不会走捷径。而在真实情况下自己写sql,就可以简化sql。而是查询他需要把对象转sql,返回在把sql转对象,其实就跟电脑一样,它是一个好学生,但是它并不聪明,只是你教会它怎么做,它会重复做你教它的事,你没教它就不会。
顺便放两组,查看执行sql的方法,多读读官方的文档,它会告诉你为什么的

print Province.objects.all().query
from core.models import Province
from django.db import connection
p = Province(name=u'河南', code='0371')
p.save()
新手上路,请多包涵

开的debug吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题