2013-05-04 111 views
1

我对正确的索引有疑问。我使用rails 3.2.13,后面使用Posgresql。顺便说一句,也许更多的是关系型数据库/索引的问题...使用Rails/Postgresql索引多列索引

我有这个表:

# 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逐年增加呈线性,说年减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 

在几句话,我使用一些和列的组合查询表 annoaccademico corsolaurea cognomenome matricola

总是我必须列命令: annoaccademico递减 corsolaurea cognomenome

我的问题:

1)考虑到表的大小,你是否建议使用索引? 2)如所示,我已经在单列上设置索引;这是正确的? 3)也许我需要添加两个多列索引,如:

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

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

这是正确的?

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

非常感谢您的耐心/我的db/sql ingnorance。 giorgio solyaris.altervista.org

+0

如果你想能够使用表达式上的索引像upper(那么你必须创建该表达式的索引:例如“CREATE INDEX ON films((lower(title)));” – 2013-05-04 07:54:58

+0

查看每个查询的执行计划(使用'explain analyze select ...')。添加您认为可能有用的inddex,然后再次检查执行计划。有关索引如何工作的详细介绍,请参阅以下链接:http://use-the-index-luke.com – 2013-05-04 15:38:04

回答

1

我喜欢你,而不是数据库的极客。所以,这就是我做的,当我经历这样一个问题:

  • 我确定将执行这个沉重的查询页面,最终移除临时认证/静态设置一个CURRENT_USER,或允许访问任何其他临时的解决办法这个页面直接没有经过登录过程
  • 我写了一个小脚本,访问此页面100次(或更多,取决于您的页面加载时间和准备等待的时间)
  • I写下执行时间
  • 我修改我的代码(在你的情况下:添加索引和迁移数据库,但它可以是任何东西否则你正在设法优化)
  • 我手动运行一次的页面(原因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) 

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

+0

如果索引列中只有少量值,那么通常会降低索引的实用性,除了表中出现的事件很少的值。因此,实际上,索引将会在不同值的数量越大时越有效。另外,我对字符串的问题不同意 - 索引字符串与索引其他类型的值一样有效。 – 2013-05-04 07:57:34

+0

好的,谢谢你的提示,我会回顾我在索引方面的知识。我会编辑我的答案 – Benj 2013-05-04 07:58:59

+0

谢谢本杰明;是的,我会测试:-) – 2013-05-04 09:58:18