COUNT(*)
主キーを持つ150,000行のテーブルを試しました。約5分間のツールなので、これはインデックス作成の問題であることがわかりました。
REINDEXは、インデックスの内容を最初から再構築するという点で、インデックスのドロップと再作成に似ています。ただし、ロックに関する考慮事項はかなり異なります。REINDEXは、インデックスの親テーブルの書き込みをロックしますが、読み取りはロックしません。また、処理中の特定のインデックスの排他ロックを取得し、そのインデックスを使用しようとする読み取りをブロックします(...)後続のCREATE INDEXは書き込みをロックしますが、読み取りはロックしません。インデックスが存在しないため、読み取りはインデックスを使用しようとしません。つまり、ブロッキングは発生しませんが、読み取りは高価な順次スキャンに追い込まれる可能性があります。
あなた自身の経験から、あなたは言うことができます:
- ある
REINDEXING
危険な?データの一貫性を損なうことはありますか? - 時間がかかりますか?
- それは私のシナリオのおそらく解決策ですか?
更新:
私たちのために働いた解決策は、別の名前で同じインデックスを再作成し、古いインデックスを削除することでした。
インデックスの作成は非常に高速であり、インデックスサイズを650 MBから8 MBに削減しました。COUNT(*)
withの使用にはbetween
3秒しかかかりません。
COUNT(*)
と、最良の選択ですIf you are using count(*), the database is free to use any column to count, which means it can pick the smallest covering index to scan (note that this is why count(*) is much better than count(some_field), as long as you don't care if null values of some_field are counted). Since indexes often fit entirely in memory, this means count(*) is often very fast.