1

我对正确的索引有疑问。我用的是rails 3.2.13,后面用的是Posgresql。顺便说一句,可能更多的是关系数据库/索引问题......

我有这张桌子:

# 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)   

我想查询数千条记录表(记录的数量每年线性增加,比如每年增加500条,即十年增加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 的一些 AND 组合来查询表

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

我的问题:

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

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

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

这是正确的 ?

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

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

4

1 回答 1

1

我和你一样,不是数据库极客。所以当我遇到这种问题时,我就是这样做的:

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

当然,您需要完整的代码和填充数据库

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

#!/bin/bash

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

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

于 2013-05-04T07:38:45.513 回答