インデックスはどこに貼るべきか?
無知な私に教えてくださいm(_ _)m
Where文でよく使う項目にインデックスを貼っていたのですが
ググったりして探してみるとどうも違うようですが、みんな曖昧な言いまわしで
よくわかりません。
たとえば、PostgreSQLで以下のようなテーブルがあるとします。
---------------------------
SNO NUMERIC(8) [PRIMARY KEY]
NAME VARCHAR(100)
SEX NUMERIC(1) -- 0:男、1:女
---------------------------
SNOは通し番号でPRIMARY KEYなのでインデックスが貼られますが
クエリー発行時に「where SEX = 1 」とよく利用する場合にSEXにはインデックスを
貼るべきなのか貼らないべきなのかが分かりません。 まぁ、列のカーディナリティが低いなら、ビットマップインデックスはるか、
パーティションテーブル使った方がいいかもな 男と女のデータの数が1:1でも
インデックスを使うとデータは半分になるわけだが。 >>12
ほぅ・・・
100万件登録されているテーブルで50万件をインデックスにより特定して全スキャンさせるのか?
データ分布が1対1で、レコードをある程度絞り込めるならインデックスを使う必要はないだろ。
>>10の考え方は、インデックスをインデックスらしく使うのではなく
インデックスを介して、そのノードが保持するテーブル内に散乱したレコードの
行番号リストを得ることを目的としてるんだが。 カーディナリティが低い場合はインデックスを忘れろ。 > 100万件登録されているテーブルで50万件をインデックスにより特定して全スキャンさせるのか?
100万件全スキャンさせるのよりも、50万件全スキャンさせるほうが
半分ですむ。 >>15
インデックスたぐるコストのほうが、べた舐めよりかかる。
多くの場合、インデックスは昇順でならんでいる。
だから最初と最後の位置を特定すれば、あとは舐めるだけと変わらない。
データが少ない場合は、最初と最後の位置を特定するコストに相殺されるが、
データが多くなると、スキャンする範囲が狭くなるので有効。
それはindexのリーフに必要なデータが揃っている場合だけな。
select SEX from TABLE where SEX=1
だーね、SQL鯖でいうクラスタ化インデックスって場合。
せめて column 名は GENDER にしないか。
>>20
甘いな・・・
若手女プログラマに列名を言わせるのが楽しいんだろ
顔真っ赤にして言われると、こっちも苦笑いするしか無いがな
30過ぎの負け犬だと躊躇することなく列名を発するからツマラン 皆さん!レスありがとうございます。
B-TREEの基礎から勉強してきました。インデックスとは何かが良くわかりました。
奥が深くて回答しづらいのも良くわかりました。こんなスレたててすみませんでした。 オカマの思う壺
ttp://megabbs.com/pickles/index.html >>22
んでどういう見解に至ったか説明せい。
カーディナリティという言葉を含めて。 インサートとかセックスとか、童貞にはハァハァ対象だな。 ソートで使う列(値はバラバラ)に
インデックスは効果ありますか? >>30
意味はあるよ。
でもバラバラにインデックスを定義するよりも、複合インデックスにした方が効果的なのは言うまでもない。
>>10
Oracle8iのオプティマイザは糞だからな。
統計情報を採取した後に、急激にパフォーマンスが悪くなるなんてこともあった。
現在のバージョンのオプティマイザは優秀になったが。
Oracle10gや11gは、カーディナリティが低いSEXのインデックスでも使用してくれるだろう。
だが1つだけ注意しないといけないことがあってな。
それはSEXの抽出条件にバインド変数を使用してしまうと、
女で抽出する場合と男で抽出する場合でも、同じ実行計画を組み立ててしまうということ。
だから、オマイの案のようなそういう特殊条件をやる場合は、
SEXの抽出条件にバインド変数を利用しないようにしないと問題が発生するだろう。
やべ、3年前のレスに返信してしもうたわw
ハズカシー (/ω\)
x‐‐―…―‐--x
人人 \
(ー:‐:‐:‐:‐:‐:‐:‐:i ヽ
マ (_________! !
ジ (ノへハノハノィi::i::ハ !
で (r心` r心ヘ::l::!|
っ(弋ソ 弋ソ}ノ::N.|
!? (:::ー''/\ー'::Y:::| て
::ハ⌒i u \/ .イ:|:| (
`ヽ::i:|\` 7{ ノ:|::!:! | ビットマップはテーブルの目的によっちゃ使わないほうが良い事もある。
トランザクション系なら避けたほうがいい。
おいらは本番で痛い目を見た......
MySQL5.x系を使っているのですが、どうも件数が遅くなりそうで心配です。
簡単に言うと、名簿を作っているのですが、
'部' '課' '係' というカラムで個人情報があって、それに対して、
( 部1 = 部2 and 課1 = null and 係1 = null ) or
( 部1 = 部2 and 課1 = 課2 and 係1 = null ) or
( 部1 = 部2 and 課1 = 課2 and 係1 = 課2l ) or
というマッチングを頻繁にやってます。
この場合、部、課、係の複合インデックスのほかに、部、課、係それぞれの
インデックスを作ることは効果あるでしょうか?
エンジンによっても違うらしいから
explainしてみるか実測してみたら? やっぱり個別インデックスをつけた方が速かったです。
エンジンは、ISAMを使っています。
更新時に重くなければ、このままインデックスをつけて
やってみます。混雑時じゃないと実測できないけど・・・。 _.. -――- ._
./ ,―――‐- .._` .、
x / ./ / / ``\. +
/_.. ィ7T.フ厂 ̄`フi ‐- ._ |〉 x
.x !  ̄フ/l/_×// |ハハl .ト、 x
|! / | /|,イ._T_i` .r≦lハ!|`` +
ll/_ .| | |'弋..!ノ i'+!l |
/ ミr`! / l |' ' ' ,‐- ..__゙ー' .!l .|
ト、ソ .! ./ .,!l .ト、 l `,! .ハ.!
/ll\ `テヽ、 /_,| |l: > .ヽ.. ィ <l l|
./' l|/l. >' / /\. | | \ \ー'/ ./ ,,;:`:;'゙"r;:゙c
' l|l l/ ./ / | | _\_×_/.ィ'...二二二l ヽ
| ヽ./ / /|.|i彡_ \\
| // ./ .l|| ´  ̄,「 ̄ 「 li ̄二ニ -'´ ヽ.
└――'"l// .|! / / ! .| |' |l //
/ __l_/_/__.|__|__l_`_ー_'_____./
∧,,,∧
( ・∀・) ほー それで
( : )
し─J
第1章 赤・緑・青編 1巻〜3巻
第2章 イエロー編 4巻〜7巻
第3章 金・銀・クリスタル編 8巻〜15巻
第4章 ルビー・サファイア編 15巻〜22巻
第5章 ファイアレッド・リーフグリーン編 22巻〜26巻
第6章 エメラルド編 26巻〜29巻
第7章 ダイヤモンド・パール編 30巻〜38巻
第8章 プラチナ編 38巻〜40巻
第9章 ハートゴールド・ソウルシルバー編 41巻〜43巻
第10章 ブラック・ホワイト編 43巻〜51巻
第11章 ブラック2・ホワイト2編 52巻〜
第12章 エックス・ワイ編 XY編2巻〜 最初に無があった
無から有が生まれた
これが全ての真理 インデックスは、DATで言うと、スタートID、DVDやBDでいうとチャプターに該当する。
スタートIDやチャプターを任意の場所に振っておくと、録音後や録画後に後から簡単に探し出せますよね。
インデックスを降っていないファイルの場合は、シーケンシャルアクセスを行い、目的のデータが見つかるまで
順番にたどり着くしか方法が無い。 誰でも簡単にパソコン1台で稼げる方法など
参考までに、
⇒ 『宮本のゴウリエセレレ』 というブログで見ることができるらしいです。
グーグル検索⇒『宮本のゴウリエセレレ』
95548V17E0