所以我一直在构建django应用程序一段时间,并且正在使用cool-aid和all:只使用ORM并且从不编写自定义SQL.
一旦你有大量的用户特定内容(即照片,朋友,其他数据等),网站的主页面(用户将花费80%的主要界面 – 90%的时间)变慢
所以我弹出了sql logger(预先安装了pinax,我只是在设置中启用了它),想象一下,当它报告超过500个数据库查询时我感到惊讶!使用手动编码的sql,我在最复杂的页面上几乎没有超过50.
事后看来,并不是所有人都感到惊讶,但似乎这并不好.
…即使只有十几个查询需要1毫秒
所以我想知道,在往返mysql时有多少开销? django和mysql在同一台服务器上运行,所以不应该有任何网络相关的开销.
解决方法:
有一些方法可以减少查询量.
>使用.filter()和.all()来获取大量内容;在视图功能中选择(或通过{%if%}选择模板). Python可以比MySQL更快地处理一批行.
“但我可以向模板发送太多信息”.没错,但是你会执行更少的SQL请求.测量哪个更好.
这是您在编写SQL时常用的操作.这没有错 – 它不会破坏ORM – 但它会优化底层数据库工作并将处理放入视图函数和模板中.
>避免在模板中进行查询导航.当您执行{{foo.bar.baz.quux}}时,SQL用于获取与foo关联的栏,然后是与栏关联的baz,然后是与baz关联的quux.您可以通过一些小心的.filter()和Python处理来减少此查询业务,以在视图函数中组合有用的元组.
同样,这是您在手工制作SQL时常常要做的事情.在这种情况下,您在视图函数中收集较大批量的ORM管理对象,并使用Python进行过滤,而不是通过大量单独的ORM请求进行过滤.
这不会打破ORM.它将使用配置文件从许多小查询更改为一些更大的查询.