16. 演習問題
16
table1のテーブル定義
table1 インデックス
物理名 型 primary key 1 id
id int 〇 2 name
name varchar(50)
レコードの情報
レコード件数:10000件
データ分布
id:1~10000の連番
name
null:100件
'test':10件
'テスト':9890件
idとnameそれぞれの
カラムにインデック
スが定義されている。
18. 演習問題
• 演習問題(table1)
18
-- ④
SELECT * FROM table1
WHERE name = 'test';
-- ⑤
SELECT * FROM table1
WHERE name LIKE '%test';
-- ⑥
SELECT * FROM table1
WHERE name LIKE 'test%';
19. 演習問題
• 演習問題(table1)
19
-- ⑦
SELECT * FROM table1
WHERE id = 100 OR name = 'テスト';
-- ⑧
SELECT * FROM table1
WHERE id = 100 AND name = 'テスト';
-- ⑨
SELECT * FROM table1
WHERE name IS NULL;
20. 演習問題
• 演習問題(table1)
20
-- ⑩
SELECT * FROM table1
WHERE trim(name) = 'test';
-- ⑪
SELECT * FROM table1
WHERE substr(name, 1, 2) = 'te';
-- ⑫
SELECT * FROM table1
WHERE name IN ('aaa', 'bbb', 'test');
22. 演習問題
• 演習問題(table2)
• マルチカラムインデックスの場合
22
-- ①
SELECT * FROM table2
WHERE column1 = 'aa1';
-- ②
SELECT * FROM table2
WHERE column2 = 'bb1';
-- ③
SELECT * FROM table2
WHERE column1 = 'aa1' OR column2 = 'bb1';
23. 演習問題
• 演習問題(table2)
23
-- ④
SELECT * FROM table2
WHERE column1 = 'aa1' AND column2 = 'bb1';
-- ⑤
SELECT * FROM table2
WHERE column2 = 'bb1' AND column1 = 'aa1';
24. 演習問題
• 演習問題(table2)
24
-- ⑥
SELECT * FROM table2
WHERE column1 = 'aa1' AND trim(column2) = 'bb1';
-- ⑦
SELECT * FROM table2
WHERE column2 = 'bb1' AND trim(column1) = 'aa1';
25. インデックスまとめ
• インデックスが使用されない条件指定まとめ
• 否定(<>)を使用している
WHERE column1 <> '100'
• 広い範囲での条件指定(ヒットする件数が多い場合)
WHERE column1 BETWEEN '1' AND '99999999'
• OR を使用している
WHERE column1 = '100' OR column2 = 'abc'
• あいまい検索(後方一致)を使用している
WHERE column1 LIKE '%abc%'
• 絞り込み対象のカラムに対して関数を適用している
WHERE TRIM(column1) = 'abc'
25