我曾经开发过几个基于python框架Django的项目。它大大提高了我的产量。但是当项目发布并且访问者越来越多时,数据库成为了性能的瓶颈。
我试着解决这个问题,发现它是ORM(django)让它变得如此之慢。为什么?因为Django必须为程序员提供统一的接口,无论你使用什么db后端。所以它肯定会牺牲一些db的性能(将一个原始sql设置为几个sql并且永远不会使用特定于db的操作)。
我想知道ORM绝对有用,它可以:
但如果我没有迁移的要求,那么ORM给我的意义是什么?
PS。最近我的朋友告诉我,他现在正在做的只是将ORM代码重写为原始sql以获得更好的性能。真可惜!
除了我上面提到的,ORM的真正含义是什么? (如果我犯了错误,请纠正我。谢谢。)
答案 0 :(得分:8)
当您列出ORM的好处时,您大多回答了自己的问题。肯定会遇到一些优化问题,但数据库接口的抽象可能会超越这些缺点。
你提到ORM有时会使用许多sql语句,它只能使用一个。如果ORM支持,您可能需要查看“预先加载”。这告诉ORM在从另一个模型获取数据的同时从相关模型中获取数据。这应该会产生更高性能的SQL。
我建议您坚持使用ORM并优化需要它的部分,但是,请探索ORM中允许您在恢复编写SQL以进行访问之前提高性能的任何方法。
答案 1 :(得分:3)
如果您发现某些查询是瓶颈,那么良好的ORM允许您调整数据访问。
但是您可能需要这样做的事实并没有以任何方式消除ORM方法的价值,因为它可以迅速让您找到瓶颈所在的位置。很少情况下,每行代码都需要相同数量的仔细手动优化。其中大部分都不会。只有少数热点需要注意。
如果您手动编写所有SQL,那么您将对整个产品进行“微优化”,包括不需要它的部分。所以你大部分都在浪费精力。
答案 2 :(得分:2)
对象关系映射是一种用于在关系数据库和面向对象编程语言中的不兼容类型系统之间转换数据的编程技术。这实际上创建了一个可以在编程语言中使用的“虚拟对象数据库”。
答案 3 :(得分:0)
一个好的ORM(比如Django)可以更快地开发和改进你的应用程序;它可以让您假设您拥有所有相关数据,而无需考虑手动调整查询中的每个用途。
但是一个简单的(像Django的)并不能解除你对旧的DB设计的好感。如果您看到数据库瓶颈少于几百个同时用户,则会出现严重问题。你的数据库没有很好地调整(通常你缺少一些索引),或者它没有恰当地代表数据设计(如果你需要为每个页面提供许多不同的查询,那么这就是你的问题)。
所以,除非你是twitter或flickr,否则我不会放弃ORM。首先进行所有常用的DB分析:你看到很多全表扫描?添加适当的索引。每页有很多查询?重新考虑你的表。每个用户都需要大量统计数据?在批量工作中预先计算它们并从那里服务。
答案 4 :(得分:0)
ORM将您分开编写那个讨厌的SQL。
当您(从不)将软件移植到另一个数据库引擎时,这也很有用。
缺点是:你失去了性能,你可以通过编写自定义的SQL来解决这个问题 - 它试图将其排除在首先写入之外。
答案 5 :(得分:0)
ORM为您生成sql查询,然后作为对象返回给您。这就是为什么它比你直接访问数据库慢。但我认为它有点慢...我建议你调整你的数据库。可能你需要检查表等的索引
例如,如果你需要更快的话,需要调整Oracle(我不知道为什么,但是我的数据库管理员这样做了,并且对于涉及大量数据的查询,它运行得更快)。我有建议,如果你需要进行复杂查询(例如:报告)而不是(创建更新删除/ CRUD),如果你的应用程序不使用其他数据库,你应该使用直接sql(我认为Django有它功能)