猿问

话说Django orm模型为什么比原生的mysqldb慢

话说Django orm模型为什么比原生的mysqldb慢


米脂
浏览 843回答 3
3回答

一只斗牛犬

首先确认下mysql索引问题.进入mysql,查看索引情况 , 命中索引.mysql> explain SELECT sum(idate_count) FROM&nbsp;buzz_keyword_historyWHERE (&nbsp;buzz_keyword_history&nbsp;.&nbsp;date&nbsp;< ’2015-09-20 00:00:00′ ANDbuzz_keyword_history&nbsp;.&nbsp;date&nbsp;>= ’2015-09-01 00:00:00′ ANDbuzz_keyword_history&nbsp;.&nbsp;value&nbsp;= ‘手机’);+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+| id | select_type | table &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| type | possible_keys &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| key &nbsp; &nbsp; &nbsp;| key_len | ref &nbsp; | rows | Extra &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+| &nbsp;1 | SIMPLE &nbsp; &nbsp; &nbsp;| buzz_keyword_history | ref &nbsp;| in_value,in_idate,search_speed | in_value | 182 &nbsp; &nbsp; | const | 1514 | Using index condition; Using where |+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+1 row in set (0.00 sec)然后在看了下mysql服务器的负载情况,load特别的底下.Pythonavg-cpu: &nbsp;%user &nbsp; %nice %system %iowait &nbsp;%steal &nbsp; %idle&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 2.80 &nbsp; &nbsp;0.00 &nbsp; &nbsp;1.22 &nbsp; &nbsp;0.41 &nbsp; &nbsp;0.00 &nbsp; 95.57Device: &nbsp; &nbsp; &nbsp; &nbsp; rrqm/s &nbsp; wrqm/s &nbsp; &nbsp; r/s &nbsp; &nbsp; w/s &nbsp; rsec/s &nbsp; wsec/s avgrq-sz avgqu-sz &nbsp; await &nbsp;svctm &nbsp;%utilsdc &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0.00 &nbsp; 808.61 &nbsp; 21.65 &nbsp; 27.02 &nbsp;5531.93 &nbsp;6685.05 &nbsp; 251.00 &nbsp; &nbsp; 0.55 &nbsp; 11.39 &nbsp; 0.71 &nbsp; 3.45sdb &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0.00 &nbsp; 126.81 &nbsp; &nbsp;3.30 &nbsp; &nbsp;4.95 &nbsp; 823.13 &nbsp;1054.05 &nbsp; 227.75 &nbsp; &nbsp; 0.37 &nbsp; 44.44 &nbsp; 1.50 &nbsp; 1.24sda &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0.06 &nbsp; 215.50 &nbsp; &nbsp;2.46 &nbsp; &nbsp;7.87 &nbsp; 599.12 &nbsp;1786.94 &nbsp; 231.10 &nbsp; &nbsp; 0.81 &nbsp; 78.76 &nbsp; 1.37 &nbsp; 1.41memdiska &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.00 &nbsp; &nbsp; 0.00 &nbsp;585.63 2638.44 84515.95 21107.53 &nbsp; &nbsp;32.76 &nbsp; &nbsp; 0.15 &nbsp; &nbsp;0.05 &nbsp; 0.03 &nbsp; 8.54dm-0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0.00 &nbsp; &nbsp; 0.00 &nbsp; &nbsp;0.00 &nbsp; &nbsp;0.00 &nbsp; &nbsp; 0.00 &nbsp; &nbsp; 0.00 &nbsp; &nbsp; 8.00 &nbsp; &nbsp; 0.00 &nbsp; &nbsp;4.39 &nbsp; 1.13 &nbsp; 0.00接着在mysql server开启了慢查询及sql语句调试模式,发现slow.log没有特别的日志…都是跟本业务无关的慢查询.整个页面的静态文件也是加载正常,速度也是给力,虽然在nginx里没有配置强制缓存… 但为毛数据加载这么慢 ,为毛 ?最后不得不重新怀疑mysql查询,我们开始统计整个django orm语句消耗的时间,一看非常的惊人,居然消耗了6秒的时间… 原本以为django 的orm只是帮助我们做了sql语句的映射,说实话我以前还真的就这么想。Pythonrun_func.objects.filter(date__gte=d[0], date__lt=d[1],value=value).aggregate(Sum(idate_or_cdate + '_count'))又看了django orm model的介绍,这django模型不简单呀,他的返回值是querysets类型。 也就是说,他会把orm执行的结果,转换成queryset结构 。 就因为这样被封装,所以我们每次用orm感觉特别友好的原因。解决的方法,直接走原生的mysql&nbsp;sql语句,在python下你的选择 mysqldb,也可以用django的connection。推荐用connection,因为大家的db地址配置都是放在settings.config里面的。下面是django 运行原始sql语句的方法,大家参考下..Pythonfrom django.db import connection, transactionimport MySQLdb.......cursor = connection.cursor(cursorclass = MySQLdb.cursors.DictCursor)cursor.execute(sql,None)如果你有多个数据库,可以在connections选择数据库。from django.db import connectionscursor = connections['xiaorui'].cursor()transaction.commit_unless_managed(using='xiaorui')最终的结果,使用原生的sql语句用了不到1秒,而用django的orm是6秒左右.. &nbsp; 快了好几倍…&nbsp;我觉得django orm应该多加个是否要转换成queryset的参数,这样我们根据需求来进行配置。 &nbsp;下面是我用django debug的结果.. 可以看到速度提升了不少.

慕的地8271018

首先确认下mysql索引问题.进入mysql,查看索引情况 , 命中索引.mysql> explainSELECT sum(idate_count) FROM buzz_keyword_historyWHERE( buzz_keyword_history . date < ’2015-09-20 00:00:00′ANDbuzz_keyword_history . date >= ’2015-09-01 00:00:00′ANDbuzz_keyword_history . value = ‘手机’);+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+|id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra|+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+|1 | SIMPLE | buzz_keyword_history | ref |in_value,in_idate,search_speed | in_value | 182 | const | 1514 |Using index condition; Using where |+—-+————-+———————-+——+——————————–+———-+———+——-+——+————————————+1 row in set (0.00 sec)

蝴蝶刀刀

struct Sales_data{std::string booKNO;unsigned untis_sold;double revenue;}
随时随地看视频慕课网APP
我要回答