ブール値フィールド (「テスト」) にインデックスを持つテーブルがあります。true の場合はインデックスを使用するため読み込みが高速ですが、false の場合は使用しません。何か間違えている?
私はここにそれの説明分析を持っています:
DB_development=# explain analyze SELECT COUNT(*) FROM "users" WHERE "users"."is_test" = 't';
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------
Aggregate (cost=22890.67..22890.68 rows=1 width=0) (actual time=1848.655..1848.656 rows=1 loops=1)
-> Index Scan using index_users_on_is_test on users (cost=0.00..22846.51 rows=17665 width=0) (actual time=34.727..1844.081 rows=21457 loops=1)
Index Cond: (is_test = true)
Filter: is_test
Total runtime: 1848.882 ms
(5 rows)
DB_development=# explain analyze SELECT COUNT(*) FROM "users" WHERE "users"."is_test" = 'f';
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Aggregate (cost=84505.74..84505.75 rows=1 width=0) (actual time=9557.632..9557.632 rows=1 loops=1)
-> Seq Scan on users (cost=0.00..84063.72 rows=176807 width=0) (actual time=71.653..9533.595 rows=219531 loops=1)
Filter: (NOT is_test)
Total runtime: 9557.655 ms
(4 rows)
アップデート
私はここを見ました インデックスを無視できるブールフィールドにインデックスを追加しています... 非テストユーザーはテストユーザーと比較して実際にはかなり多いのが正しい原因だと思います。
DB_development=# SELECT COUNT(*) FROM "users" WHERE "users"."is_test" = 't';
count
-------
21457
(1 row)
DB_development=# SELECT COUNT(*) FROM "users" WHERE "users"."is_test" = 'f';
count
--------
219531
(1 row)
その場合...どうすれば簡単にカウントできますか?
アップデート
テーブルとインデックスの作成は次のとおりです。
create_table "users", :force => true do |t|
t.integer "genre_id"
t.integer "country_id"
t.boolean "is_test", :default => false
t.datetime "created_at"
t.datetime "updated_at"
... + 90 more fields (it's my main table)
end
add_index "users", ["country_id"], :name => "index_users_on_country_id"
add_index "users", ["genre_id"], :name => "index_users_on_genre_id"
add_index "users", ["is_test"], :name => "index_users_on_is_test"
... + 17 more indexes