首页>>后端>>Python->django如何解决数据库慢(django响应慢)

django如何解决数据库慢(django响应慢)

时间:2023-12-20 本站 点击:0

导读:很多朋友问到关于django如何解决数据库慢的相关问题,本文首席CTO笔记就来为大家做个详细解答,供大家参考,希望对大家有所帮助!一起来看看吧!

如何优化 Django REST Framework 的性能

解决 Django 「懒惰」的基本方法

现在我们解决这个问题的方法就是「预加载」。从本质上讲,就是你提前警告 Django ORM 你要一遍又一遍的告诉它同样无聊的指令。在上面的例子中,在 DRF 开始获取前很简单地加上这句话就搞定了:

queryset = queryset.prefetch_related('orders')

当 DRF 调用上述相同序列化 customers 时,出现的是这种情况:

获取所有 customers (执行两个往返数据库操作,第一个是获取 customers,第二个获取相关 customers 的所有相关的 orders。)

对于第一个返回的 customers,获取其 order (不需要访问数据库,我们已经在上一步中获取了所需要的数据)

对于第二个返回的 customers,获取其 order (不需要访问数据库)

对于第三个返回的 customers,获取其 order (不需要访问数据库)

对于第四个返回的 customers,获取其 order (不需要访问数据库)

对于第五个返回的 customers,获取其 order (不需要访问数据库)

对于第六个返回的 customers,获取其 order (不需要访问数据库)

你又意识到,你可以有了 很多 customers ,已经不需要再继续等待去数据库。

其实 Django ORM 的「预备」是在第1步进行请求,它在本地高速缓存的数据能够提供步骤2+所要求的数据。与之前往返数据库相比从本地缓存数据中读取数据基本上是瞬时的,所以我们在有很多 customers 时就获得了巨大的性能加速。

解决 Django REST Framework 性能问题的标准化模式

我们已经确定了一个优化 Django REST Framework 性能问题的通用模式,那就是每当序列化查询嵌套字段时,我们就添加一个新的 @staticmethod 名叫 setup_eager_loading ,像这样:

class CustomerSerializer(serializers.ModelSerializer):

orders = OrderSerializer(many=True, read_only=True)

def setup_eager_loading(cls, queryset):

""" Perform necessary eager loading of data. """

queryset = queryset.prefetch_related('orders')

return queryset

这样,不管哪里要用到这个序列化,都只需在调用序列化前简单调用 setup_eager_loading ,就像这样:

customer_qs = Customers.objects.all()

customer_qs = CustomerSerializer.setup_eager_loading(customer_qs) # Set up eager loading to avoid N+1 selects

post_data = CustomerSerializer(customer_qs, many=True).data

或者,如果你有一个 APIView 或 ViewSet ,你可以在 get_queryset 方法里调用 setup_eager_loading :

def get_queryset(self):

queryset = Customers.objects.all()

# Set up eager loading to avoid N+1 selects

queryset = self.get_serializer_class().setup_eager_loading(queryset)

return queryset

Django的多数据库问题,怎么解决

选择开始菜单中→程序→【Management SQL Server 2008】→【SQL Server Management Studio】命令,打开【SQL Server Management Studio】窗口,并使用Windows或 SQL Server身份验证建立连接。

在【对象资源管理器】窗口中展开服务器,然后选择【数据库】节点

右键单击【数据库】节点,从弹出来的快捷菜单中选择【新建数据库】命令。

执行上述操作后,会弹出【新建数据库】对话框。在对话框、左侧有3个选项,分别是【常规】、【选项】和【文件组】。完成这三个选项中的设置会后,就完成了数据库的创建工作,

在【数据库名称】文本框中输入要新建数据库的名称。例如,这里以“新建的数据库”。

在【所有者】文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用【使用全文索引】复选框。

在【数据库文件】列表中包括两行,一行是数据库文件,而另一行是日记文件。通过单击下面的【添加】、【删除】按钮添加或删除数据库文件。

切换到【选项页】、在这里可以设置数据库的排序规则、恢复模式、兼容级别和其他属性。

切换到【文件组】页,在这里可以添加或删除文件组。

完成以上操作后,单击【确定】按钮关闭【新建数据库】对话框。至此“新建的数据”数据库创建成功。新建的数据库可以再【对象资源管理器】窗口看到。

在使用django的时候,大家是如何保证数据库

目前到django1.7 为止 修改model的前提是:你已经创建完model,并且已经 使用 syncdb 或 migrate 创建了相应的数据库表。 然后再 修改model,不会对数据库表产生任何修改的。 具体的东西,自己去看 Django 相应版本的文档去吧 不同版本,不太一样。

求教,django的数据库错误的解决方法

错误代码 1045

Access denied for user 'root'@'localhost'

(using password:YES)

如果你的mysql也出现以上这种提示,

建议你逐个字看完我这篇文章再按以下方法来尝试解决问题.

这是mysql数据库很多时候出现的问题, 网上流传很多解决办法. 有人按照那些方法, 还真可以把问题解决了; 但也有很多人按那些方法解决不了问题!

而这个中原因, 就是没有对症下药!!!

网上的那些方法, 很多都没有明确指出是什么版本的mysql, 所以导致问题者不能对症下药.

出现这个问题, 通过停止/重启 mysql 服务, 是可以解决的, 这个是最简单的办法! 对于不懂得什么叫做"停止/重启mysql服务"的人来说,

这个最简单的办法就是把服务器主机进行重新启动(就是把你的电脑进行重新启动).

以上是方法A! (这个方法适合任何版本的mysql)

以下是方法B:(方法仅适用于MySQL4.0.26 版本!!! (我估计,

4.0的其他版本应该也可以的))

网上也有说, 就是对root进行重改密码. 对于网上流传的改密码方法, 也是可行的. 请参考以下:

DOS下修改ROOT密码:当然后面安装PHPMYADMIN后修改密码也可以通过PHPMYADMIN修改

格式:mysqladmin -u用户名 -p旧密码 password

新密码

例:给root加个密码ideacmblog

首先在进入CMD命令行,转到MYSQL目录下的bin目录,然后键入以下命令

mysqladmin

-uroot password ideacmblog

注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。

D:\php\MySQL\binmysqladmin -uroot password

ideacmblog回车后ROOT密码就设置为ideacmblog了

但是, 请注意了, 以上方法仅适用于MySQL4.0.26

版本!!! (我估计, 4.0的其他版本应该也可以的)

方法C:

好了, 扯了那么多, 以上的两个方法都不是我本人测试过的, 本人不对真实性负责!

而现在我说一下本人亲自试过的方法, 以供参考:

话说今天, 我的服务器所有php及使用了mysql数据库的网站, 均挂掉了! 无法打开,

并有以下提示:

错误代码 1045

Access denied for

user 'root'@'localhost' (using password:YES)

一开始我也是不断搜索google(我本人不喜欢百度!),

去找寻解决的办法. 看了很多, 也参照执行了, 事实上也是解决不了问题. 后来我想到了是版本的问题, 不同的mysql版本,

解决办法是不一定一样的!!记住...

我的mysql版本是: 5.0.22

(mysql-essential-5.0.22-win32)

今天一整天, 那些php网站均罢工. 到今晚才有时间上去服务器继续寻找方法, 但仍然解决不了.

最后, 我决定把mysql卸掉重新安装!

卸载很快, 而且不需要重新启动计算机.

于是, 继续进行安装.

第一步:

打开这个mysql-essential-5.0.22-win32.exe文件;

第二步: 见到窗口弹出, 并点击 Next

进入下一步;

第三步: 选择 Custom 项, 并点击

Next 进入下一步;

第四步: 到这一步要注意了, 点击

Change... 选择你原安装mysql的目录; 选择后, 继续点击Next 进入下一步;

第五步: 点击 Install

进行安装...

安装至下一步, 会提示你进行注册, 选择最后一项, 即跳过注册,

进入下一步正式完成安装.

安装完成后, 继续弹出一个窗口, 提示你是不是立刻进行配置,

选择 Next

选择Standard Configuration.继续点击

Next 进入下一步

这一步里, 把上面那行的勾去掉, 只在 Include

....PATH 那行打勾, 继续点击 Next 进入下一步

在这一步, 点击中间的"Ex****"那顶,

接着配置完毕!

django如何解决单表数据大的问题

通过mysql中间件来解决。

一般套路是在中间件中配置分表规则,一般也是分表维度和分表数量。

这样,程序要改动的地方只需要把数据库连接地址修改为中间件的地址就可以了,剩下的逻辑全部靠中间件来完成即可。

这种办法非常偷懒,但是可以解放RD的压力。

如何处理django的数据库连接池

由于创建连接的代价是很高的, 我们每次访问数据库都重新创建连接的话是非常消耗性的.

我们可以再程序启动的时候先创建出一些连接, 放在一个集合中, 访问数据库的时候从集合中获取, 使用结束再放回集合中.

这样做只是在程序启动的时候消耗性能去创建连接, 每次访问数据库的时候都是从内存中获取连接, 可以大大提升效率.

注意事项:

由于池中增删非常频繁, 使用集合LinkedList效率较高

集合中所有连接都被占用时创建新连接, 但需要注意连接总数

使用组合模式/动态代理处理释放连接的方法, 当运行close方法时, 将连接放回池中

关于数据库连接池:

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被 使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超 过最大连接数量时,这些请求将被加入到等待队列中。

数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:

1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。

调用:客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为 忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。

释放:当使用的池连接调用完成后,池驱动程序将此连接表记为空闲, 其他调用就可以使用这个连接

结语:以上就是首席CTO笔记为大家整理的关于django如何解决数据库慢的全部内容了,感谢您花时间阅读本站内容,希望对您有所帮助,更多关于django如何解决数据库慢的相关内容别忘了在本站进行查找喔。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Python/45947.html