インデックス

★Index対象

★DMLに対する影響(参考のみ)

INSERT 56%↓

UPDATE 47%↓

DELETE 29%↓

※Read操作が頻繁に行う処理ではIndexを考慮すべき

★複合Index

対象:取得するカラムは数が少ない且内容が小さい

テーブルではなく、Indexのみで検索するため、一般的に性能アップ

例:

SELECT id, name FROM test WHRER type='1';

CREATE INDEX my_index ON test(type, id, name);

★インデックスが使われないバインド

int id = 1001;

String sql = "SELECT NAME FROM MEMBER WHERE ID = ? ";

PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, id); ×

// 対策1

pstmt.setString(1, String.valueOf(id));

// 対策2(0埋め)

pstmt.setString(1, StringUtils.leftPad(String.valueOf(id), 5, '0'));

// 対策3(0埋め)

String sql = "SELECT NAME FROM MEMBER WHERE ID = LPAD(?, 5, '0') ";

★インデックスが使われるWHERE文

INDEX_COLUMN = ?

INDEX_COLUMN > ?

INDEX_COLUMN >= ?

INDEX_COLUMN < ?

INDEX_COLUMN <= ?

INDEX_COLUMN BETWEEN ? AND ?

INDEX_COLUMN IN (?,?,...,?)

INDEX_COLUMN LIKE ?||'%' 前方一致

T1.INDEX_COLUMN = T2.COLUMN1

CHAR_INDEX_COLUMN = CAST(10, AS CHAR(2))

★インデックスが使われないWHERE文

INDEX_COLUMN <> ?

INDEX_COLUMN > ? OR INDEX_COLUMN < ?

INDEX_COLUMN NOT IN (?,?,...,?)

function(INDEX_COLUMN) = ? 左辺で関数

INDEX_COLUMN + 1 = ? 左辺で計算

INDEX_COLUMN || 'a' = ?

INDEX_COLUMN LIKE '%'||? 後方一致

INDEX_COLUMN LIKE '%'||?||'%' 中間一致

INDEX_COLUMN IS NULL

NUMBER_INDEX_COLUMN = '123' 暗黙の型変換を含む

CHAR_INDEX_COLUMN = 123 暗黙の型変換を含む