Contenu connexe Similaire à MySQL勉強会 インデックス編.2013 08-02 Similaire à MySQL勉強会 インデックス編.2013 08-02 (20) MySQL勉強会 インデックス編.2013 08-0216. mysql>
UPDATE
prize_history
SET
del_flg
=
1
WHERE
prize_id
=
14
AND
ctime
BETWEEN
'2013-05-18
00:00:00'
AND
'2013-05-24
00:00:00';
実行するSQL
イベント報酬ID
イベント開始日時
イベント終了日時
21. mysql>
EXPLAIN
SELECT
*
FROM
prize_history
WHERE
prize_id
=
14
AND
ctime
BETWEEN
'2013-05-18
00:00:00'
AND
'2013-05-24
00:00:00'G;
***************************
1.
row
***************************
id:
1
select_type:
SIMPLE
table:
prize_history
type:
ALL
possible_keys:
NULL
key:
NULL
key_len:
NULL
ref:
NULL
rows:
2233733
Extra:
Using
where
【クエリーのタイプ】:全件検索
【使用されているインデックス】:
インデックスが使われていない
【検索行数】:テーブル全行数
【追加情報(処理方法)】:Using temoraryと、 Using filesortは要注意、それぞ
れ、一時書き出し、ファイルソートが発生していてクエリーが遅くなる傾向がある
22. SHOW
INDEX
FROM
prize_history;
+----------------------+------------+----------+--------------+-----------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
|
Table
|
Non_unique
|
Key_name
|
Seq_in_index
|
Column_name
|
Collation
|
Cardinality
|
Sub_part
|
Packed
|
Null
|
Index_type
|
Comment
|
Index_comment
|
+----------------------+------------+----------+--------------+-----------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
|
prize_history
|
0
|
PRIMARY
|
1
|
prize_history_id
|
A
|
2235476
|
NULL
|
NULL
|
|
BTREE
|
|
|
|
prize_history
|
1
|
user_id
|
1
|
user_id
|
A
|
2235476
|
NULL
|
NULL
|
|
BTREE
|
|
|
|
prize_history
|
1
|
user_id
|
2
|
receive_flg
|
A
|
2235476
|
NULL
|
NULL
|
|
BTREE
|
|
|
|
prize_history
|
1
|
user_id
|
3
|
prize_id
|
A
|
2235476
|
NULL
|
NULL
|
|
BTREE
|
|
|
+----------------------+------------+----------+--------------+-----------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4
rows
in
set
(5.73
sec)
インデックスを確認する
ctimeのインデックスがない
インデックス名
インデックス種別
対象カラム
プライマリキー
プライマリキー
prize_history
user_id インデックス
user_id,receive_flg,prize_id
23. ALTER
TABLE
prize_history
ADD
KEY
prize_id
(prize_id,ctime);
EXPLAIN
SELECT
*
FROM
prize_history
WHERE
prize_id
=
14
AND
ctime
BETWEEN
'2013-05-18
00:00:00'
AND
'2013-05-24
00:00:00'G;
***************************
1.
row
***************************
id:
1
select_type:
SIMPLE
table:
prize_history
type:
range
possible_keys:
prize_id
key:
prize_id
key_len:
12
ref:
NULL
rows:
186246
Extra:
Using
where;
インデックス追加
24. ■
BEFORE
mysql>
SELECT
SQL_NO_CACHE
count(*)
FROM
prize_history
WHERE
prize_id
=
14
AND
ctime
BETWEEN
'2013-05-18
00:00:00'
AND
'2013-05-24
00:00:00';
+----------+
|
count(*)
|
+----------+
|
86399
|
+----------+
1
row
in
set
(3.62
sec)
■
AFTER
mysql>
SELECT
SQL_NO_CACHE
count(*)
FROM
prize_history
WHERE
prize_id
=
14
AND
ctime
BETWEEN
'2013-05-18
00:00:00'
AND
'2013-05-24
00:00:00';
+----------+
|
count(*)
|
+----------+
|
86399
|
+----------+
1
row
in
set
(0.06
sec)
BEFORE/AFTER
60xFAST
28. SELECT
prize_history_id
FROM
prize_history
WHERE
ctime
<
'2013-05-18
00:00:00'
ORDER
BY
prize_history_id
DESC
LIMIT
1;
+-----------------------+
|
prize_history_id
|
+-----------------------+
|
2008199
|
+-----------------------+
イベント開催日時
※バックアップサーバーで実行
29. SELECT
prize_history_id
FROM
prize_history
WHERE
ctime
<
'2013-05-24
00:00:00'
ORDER
BY
prize_history_id
DESC
LIMIT
1;
+-----------------------+
|
prize_history_id
|
+-----------------------+
|
2094599
|
+-----------------------+
イベント終了日時
※バックアップサーバーで実行
30. mysql>
EXPLAIN
SELECT
*
FROM
prize_history
WHERE
prize_id
=
14
AND
prize_history_id
BETWEEN
2008199
AND
2094599G;
***************************
1.
row
***************************
id:
1
select_type:
SIMPLE
table:
prize_history
type:
range
possible_keys:
PRIMARY
key:
PRIMARY
key_len:
8
ref:
NULL
rows:
174524
Extra:
Using
where
期間をプライマリキーに
置き換えてEXPLAIN
31. UPDATE
prize_history
SET
del_flg=1
WHERE
prize_id
=
14
AND
prize_history_id
BETWEEN
2008199
AND
2094599;
UPDATE文を作成
×
36. SELECT
CONCAT(
'UPDATE prize_history
',
'SET
del_flg
=
1
',
'WHERE
prize_history_id
=',
prize_history_id,';'
)
FROM
prize_history
WHERE
prize_id
=
14
AND
prize_history_id
BETWEEN
2008199
AND
2094599;
UPDATE文作成
※バックアップサーバーで実行
37. バックアップ作成
SELECT
CONCAT(
'UPDATE prize_history
',
'SET
del_flg
=
',del_flg,'
',
'WHERE
prize_history_id
=',
prize_history_id,';'
)
FROM
prize_history
WHERE
prize_id
=
14
AND
prize_history_id
BETWEEN
2008199
AND
2094599;
※バックアップサーバーで実行
45. テスト用テーブル
・サンプルのデータは10万件
カラム名
型
id unsinged int(11)
A unsinged int(11)
B varchar(255)
C unsinged int(11)
インデックス
名
インデックス
種別
対象カラム
pkey プライマリキー
Id
index_A インデックス
A
index_B インデックス
B
index_C インデックス
C
index_A_B_
C
インデックス
A,B,C
46. 複合インデックス
が使える場合
• SELECT * FROM test WHERE A=1 and B=2 and C=3
• SELECT * FROM test WHERE A=1 and B=2
• SELECT * FROM test WHERE A=1
※ INDEX index_a_b_c(A,B,C)の場合
47. 複合インデックス
が使えない場合
• SELECT * FROM test WHERE B=2 and C=3
• SELECT * FROM test WHERE A=1 and C=3
• SELECT * FROM test WHERE B=2
※ INDEX index_a_b_c(A,B,C)の場合
51. カバリングインデックスの例
• SELECT A,B,C FROM test WHERE A=1 and B=2 and C=3
• SELECT A FROM test WHERE A=1 and B=2
• SELECT A,B,C FROM test WHERE A=1
※ INDEX index_a_b_c(A,B,C)の場合
52. カバリングインデックス
EXPLAIN
EXPLAIN
SELECT
A,B,C
FROM
test
WHERE
A=757
AND
b='0.ZYc2FHB0kpo'
G;
***************************
1.
row
***************************
id:
1
select_type:
SIMPLE
table:
test
type:
ref
possible_keys:
index_A,index_B,index_A_B_C
key:
index_A_B_C
key_len:
771
ref:
const,const
rows:
1
Extra:
Using
where;
Using
index
Indexを使っているという
意味ではない。Index内
のデータを使用している
という意味(カバリングイ
ンデックス)