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アイテムずつ、つまり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 のいくつかの AND の組み合わせを使用して、テーブルをクエリします。

常に列ごとに並べる必要があります: annoaccademico desc corsolaurea cognomenome

私の質問:

1) テーブルのサイズを考慮して、とにかくインデックスを使用することをお勧めしますか? 2)示されているように、私はすでに単一の列にインデックスを設定しています。そのとおりです ?3) おそらく、次のような 2 つの複数列インデックスを追加する必要があります。

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

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

それは正しい ?

私にはあまり明確ではないのはポイントです:別の選択条件、インデックスは order by 句にも役立ちますか?

あなたの忍耐に感謝します/私のdb / sql無知。ジョルジオ・ソリャリス.altervista.org

4

1 に答える 1

1

私はあなたと同じで、データベースのオタクではありません。ですから、この種の質問を受けるときは、次のようにします。

  • この重いクエリを実行するページを特定し、最終的に一時的な認証を削除する/ current_user を静的に設定するか、ログインプロセスを経ずにこのページに直接アクセスできるようにするその他の一時的な修正を行います
  • このページに100回アクセスする小さなスクリプトを作成します(ページの読み込み時間と待機時間によっては、それ以上)
  • 実行時間を書き留めます
  • コードを変更します(あなたの場合:インデックスを追加してデータベースを移行しますが、最適化しようとしているものは何でもかまいません)
  • ページを手動で 1 回実行します (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 に答える