我正在尝试在具有n + 1个5000对象的非信息应用程序中使用Eager Loading。这是急切加载的查询:
2855, 2856, 2857, 2858, 2859, 2860, 2861, 2862, 2863, 2864, 2865, 2866, 2867, 2868, 2869, 2870, 2871, 2872, 2873, 2874, 2875, 2876, 2877, 2878, 2879, 2880, 2881, 2882, 2883, 2884, 2885, 2886, 2887, 2888, 2889, 2890, 2891, 2892, 2893, 2894, 2895, 2896, 2897, 2898, 2899, 2900, 2901, 2902, 2903, 2904, 2905, 2906, 2907, 2908, 2909, 2910, 2911, 2912, 2913, 2914, 2915, 2916, 2917, 2918, 2919, 2920, 2921, 2922, 2923, 2924, 2925, 2926, 2927, 2928, 2929, 2930, 2931, 2932, 2933, 2934, 2935, 2936, 2937, 2938, 2939, 2940, 2941, 2942, 2943, 2944, 2945, 2946, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 2955, 2956, 2957, 2958, 2959, 2960, 2961, 2962, 2963, 2964, 2965, 2966, 2967, 2968, 2969, 2970, 2971, 2972, 2973, 2974, 2975, 2976, 2977, 2978, 2979, 2980, 2981, 2982, 2983, 2984, 2985, 2986, 2987, 2988, 2989, 2990, 2991, 2992, 2993, 2994, 2995, 2996, 2997, 2998, 2999, 3000, 3001)
Rendered author/index.html.erb within layouts/application (2373.7ms)
Completed 200 OK in 2398ms (Views: 2357.5ms | ActiveRecord: 40.3ms)
在视图加载时间和AR加载时间方面比延迟加载更快(如果我使用.all,加载需要10秒),但由于某种原因,页面挂起的时间超过10秒,即使视图需要更长时间才能加载。知道为什么吗?
答案 0 :(得分:0)
由于您正在谈论急切加载,这意味着发生了一些sql JOIN
,例如,如果每个作者都有很多帖子,那意味着1个查询将会必须加载5000个作者及其所有帖子,这是一个非常大的数字,与延迟加载相反,您有很多查询,但它们非常简单快速(如果右列上有索引),但由于其中很多,它仍然很慢。
然而,一次加载5000个对象并不是性能明智,这会对数据库造成非常大的负担,并且您的用户都不会同时需要所有这些数据。想象一下,如果谷歌会在你的搜索查询上给你5000页,那会怎么样呢 - 这会停止搜索,因为a)它会给谷歌服务器带来沉重负担,而b)页面填充速度非常快给用户带来很多挫折。
考虑整合一些分页宝石,例如Kaminari或will_paginate。
更新:有一个wonderful article关于Rails中不同类型的急切加载(是的,它们中有很多),这是一个非常有趣的阅读。
玩得开心!