使用Rails / Postgresql索引多列索引

时间:2013-05-04 06:24:53

标签: sql ruby-on-rails postgresql database-design indexing

我对正确的索引有疑问。我使用rails 3.2.13,后面使用Posgresql。 BTW,可能更多关系数据库/索引问题...

我有这张桌子:

# Table name: exams
#
#  id             :integer          not null, primary key
#  cognomenome    :string(255)
#  matricola      :string(255)
#  corsolaurea    :string(255)
#  annoaccademico :string(255)
#  blablabla
#
# Indexes
#
#  index_exams_on_annoaccademico  (annoaccademico)
#  index_exams_on_cognomenome     (cognomenome)
#  index_exams_on_corsolaurea     (corsolaurea)
#  index_exams_on_matricola       (matricola)   

我想查询成千上万的记录表(每年记录的nymber线性增加,比如evey年的500项,即10年内的5000-6000);

我必须提出这些问题:

SELECT "exams".* FROM "exams" WHERE (upper(cognomenome) like '%GIORGIO%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0

或那:

SELECT "exams".* FROM "exams" WHERE (matricola like '%8327483274%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0

或那:

SELECT "exams".* FROM "exams" WHERE (annoaccademico = '2013') AND (upper(cognomenome) like '%GIORGIO%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0

或那:

SELECT "exams".* FROM "exams" WHERE (corsolaurea = 'Infermieristica') AND (upper(cognomenome) like
'%GIORGIO%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0

或那:

SELECT "exams".* FROM "exams" WHERE (corsolaurea = 'Medicina-Anatomia I' and annoaccademico = '2013') AND (upper(cognomenome) like '%GIORGIO%') ORDER BY annoaccademico desc, corsolaurea, cognomenome LIMIT 50 OFFSET 0

简而言之,我使用一些AND组合列来查询表 annoaccademico corsolaurea cognomenome matricola

总是我必须按列排序: annoaccademico desc corsolaurea cognomenome

我的问题:

1)考虑到表格大小,您是否建议使用索引? 2)如图所示我已在单列上设置索引;那是对的吗? 3)可能我需要添加两个多列索引,如:

add_index :exams, [:annoaccademico, :corsolaurea, :cognomenome]

add_index :exams, [:annoaccademico, :corsolaurea, :matricola]

那是对的吗?

对我来说不太清楚的是: 除了选择条件,索引是否也适用于order by子句?

非常感谢您的耐心/我的db / sql无知。 乔治 solyaris.altervista.org

1 个答案:

答案 0 :(得分:1)

我喜欢你,而不是数据库的极客。这就是我在经历这类问题时所做的事情:

  • 我确定将执行此大量查询的页面,最终删除临时身份验证/静态设置current_user,或者允许直接访问此页面而不经过登录过程的任何其他临时修订
  • 我写了一个小脚本,访问此页面100次(或更多,取决于您的页面加载时间,以及您准备等待的时间)
  • 我记下执行时间
  • 我修改了我的代码(在你的情况下:添加索引和迁移数据库,但它可以是你想要优化的任何其他东西)
  • 我手动运行一次页面(因为Rails会缓存很多东西,我不希望这些开销在我的计算中)
  • 我再次运行脚本并比较结果

当然,您需要完成代码并填写数据库

这是我正在使用的脚本(你只需要卷曲)

#!/bin/bash

time (for ((i=0; i<100;i++)); do curl -s -o /dev/null http://127.0.0.1:3000/my_page; done)

所以我的答案是:测试它,这种情况取决于你的应用和你的数据,所以唯一的方法就是测试它