我想知道具有主键和没有主键的表是否存在任何与性能相关的起伏。
我有一个包含两个表的模式。
没有ID的表
create_table "site_page_views", :id => false, :force => true do |t|
t.integer "site_id"
t.integer "page_id"
t.integer "visit_count", :default => 0, :null => false
t.date "start_date"
t.date "end_date"
end
add_index "site_page_views", ["end_date"], :name => "index_site_page_views_on_end_date"
add_index "site_page_views", ["site_id"], :name => "index_site_page_views_on_site_id"
add_index "site_page_views", ["start_date", "end_date"], :name => "index_site_page_views_on_start_date_and_end_date"
add_index "site_page_views", ["start_date"], :name => "index_site_page_views_on_start_date"
ID为的表
create_table "content_views", :force => true do |t|
t.integer "site_id"
t.integer "page_id"
t.integer "visit_count", :default => 0, :null => false
t.string "type"
t.date "start_date"
t.date "end_date"
end
add_index "content_views", ["page_id"], :name => "index_content_views_on_page_id"
add_index "content_views", ["site_id"], :name => "index_content_views_on_site_id"
add_index "content_views", ["start_date", "end_date"], :name => "index_content_views_on_start_date_and_end_date"
add_index "content_views", ["type"], :name => "index_content_views_on_type"
如果你看一下第二个表,它代表一个STI(单表继承)
我在两个表中都有类似的数据(这只是一个奇怪的测试),当我查询记录以获取日期范围之间的记录时。我得到以下基准测试结果
puts 'No primary Key :' Benchmark.bm do |b|
b.report {
SitePageView.where(site_id: 123,
start_date: start_date,
end_date: end_date).includes(:page)
.order('visit_count DESC').limit(100).all }.real * 1000
end
=> No primay key : 176 ms
puts 'With primary Key :' Benchmark.bm do |b|
b.report {
StiPageViews.where(site_id: 123,
start_date: start_date,
end_date: end_date).includes(:page)
.order('visit_count DESC').limit(100).all }.real * 1000
end
=> With primay key : 101 ms
没有主键的表格缓慢的原因是什么?
答案 0 :(得分:0)
主键具有自动索引。您无需手动索引主键。
但是,您的查询不使用主键列。
因此,性能不应有任何差异。
更好地检查postgres中的查询执行时间。