ハードディスクメンテナンス ブログ

投稿記事数8,000以上!PC,カメラ,オーディオ,ラジオ,航空,旧ゲームなど

[MySQL] index定義の無駄と、indexが役に立たない場合 [悪例,アンチパターン]

   

>>高還元のクレジットカード比較 期間限定のキャッシュバックなど!<<


データベースで重要なindexであるが、全てのfieldにindexを定義するのは、多くの場合は無駄である。

定義しても、それが使用されなければ意味がない。

indexを定義することは、fieldのコピーを作ることに近く、更新性能の低下を招く。

全てのfieldにindexを追加すれば、テーブルが2つあるのと同じだ。

書込が発生すると、両方に書き込まねばならない(更新も同様)。

indexが役立つか分からないのに、全てのfieldに対してindexを設定するのは無駄。

読取がメインの場合は、ないよりはマシだろうが…

indexを設定しても全く使わないだろうfieldは、それほど考えなくても分かるはずだ。

よく見るのが、主キーには既にindexがあるのに、それとは別にindexを定義しているパターン。

冗長で無駄である。

なお、SQLによっては、indexが役に立たない(使われない)場合もある。

姓名の姓が●は、紙の電話帳で探せる。

紙の電話帳には、姓の順で並んでいるからだ。

しかし、名が●の場合は、これが使えない。

全ての姓に対して、名が●である可能性があるからだ。

複合indexを姓(sei),名(mei)の順で設定しても、名でのSELECT時には役に立たない。

同様に、名を第一基準にするORDER BY時にも役に立たない。

SELECT * FROM user ORDER BY mei,sei ;

また、LIKEで’%●’と前に%を入れた場合(後方一致)も、全てに一致する可能性があるのでindexが役立たない。

‘%●%’と挟んだ中間一致も同様。

演算しての比較なども、indexは役に立たない。

WHERE price * 1.08 > 1000 ;

のような場合。

indexにあるデータはpriceであってprice * 1.08ではないからだ。

これは、両辺を1.08で割って

WHERE price > 1000/1.08 ;

とすると、indexが使用できるようになる。

否定形(<>)や、IS NULL、ORも、indexが利用できない。

但し、ORはINで書き換えると、indexを使用できるようになる。

EXPLAINで、設定したindexがpossible_keysに含まれており、keyで実際し使用されているか確認しておく。

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ
達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

スポンサーリンク
posted on shattered-blog.com at 14.06.29
ミック
翔泳社
売り上げランキング: 10,850

以下のSQLアンチパターンはおすすめ。

悪例を提示して解説してある。

あー、これこれ、あるある!みたいなwwwww

問題なく動いているから、というSQLの書き方をしていると、レコードが増えると重くなったりしない?

あとのことを考えていないのね。

また、予想した結果がSELECTされているからOK!と判断したりしてない?

様々なレコードが増えてきた場合、予期しない結果を返してこない?

SQLアンチパターン
Bill Karwin
オライリージャパン
売り上げランキング: 7,908

SQL中で型の変換を「意識せずに」してしまい、あれ?index使用してない?とかwww




sha-bc@336×280

sha-bc@336×280


sha-bc@336×280

sha-bc@336×280

  関連記事

no image
クエリに対して複数コアを使いこなさない問題(MySQL)

3コアのCPUに換装したDBサーバーであるが、重いクエリを発行した場合、複数コア …

SSDとHDD_換装_CF-R6_C300(64GB)
Panasonic CF-R6の分解②(ハードディスクをSSDへ換装) CF-R7,CF-R8も同様

熱杉流かつ遅杉流、Panasonic(旧松下)のノートパソコンである、CF-R6 …

ダンプ行を指定する箇所
[MySQL] テーブルのエクスポートで、レコード数の不一致が生じる問題 [phpMyAdmin,Dump all rows]

DB(MySQL)にある巨大なテーブルをローカルに保存したいという質問を受けた。 …

E3110
DBサーバーのハードウェア換装(Debian7.4,MySQL5.5.35) Xeon E3110

試験データベースサーバー(DBサーバー)を入れ替えた。 Debian7.4(64 …

霜
冷杉流冷蔵庫 vs 灼熱CF-R6 – 冷却と発熱の仁義ナキ戦い、キミはこの衝撃に耐えられるかッ!!

冷蔵庫のハナシをこのブログで書くとは思わなかったが… 自宅には冷蔵庫 …

no image
PowerEdgeT105のCPU換装(2コアから3コアに)

DELLのサーバーであるPowerEdgeT105のCPUを ①Athlon64 …

no image
Apache Server Information の設定 (Apache2.2.22 ,Debian7.4)

Apache/2.2.22 (Debian7.4) ローカルの試験サーバーのIP …

no image
[mb_send_mail] 自宅Debianサーバーからメール送信 [Debian,exim4,Gmail]

自宅サーバー(Debian)から、外部へメールを送信する。 システムのエラー発生 …

no image
Linuxのシステム情報の確認方法(OS,CPU,メモリ)

Windowsであれば、デスクトップ上の「マイコンピュータ」を右クリック>プロパ …

no image
[解決]ローカル内の他の端末からMySQLに接続できない件[my.cnf,bind-address]

DebianにMySQLを入れてDBサーバーとし、ローカル環境に置く。 試験サー …