インデックス
★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 暗黙の型変換を含む