SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our User Agreement and Privacy Policy.
SlideShare uses cookies to improve functionality and performance, and to provide you with relevant advertising. If you continue browsing the site, you agree to the use of cookies on this website. See our Privacy Policy and User Agreement for details.
Successfully reported this slideshow.
Activate your 14 day free trial to unlock unlimited reading.
3.
試してみよう
• 普通の SELECT
文
– SELECT
*
FROM
user
LIMIT
10;
– SELECT
*
FROM
user;
• 条件指定
– SELECT
*
FROM
user
WHERE
id
=
'109092915251428393573';
– SELECT
*
FROM
user
WHERE
name
=
'天野仁史';
– SELECT
id,
name
FROM
user
WHERE
created_at
>
DATE_SUB(NOW(),
INTERVAL
10
MINUTE);
• 同姓同名ランキング
– SELECT
user.name,
COUNT(id)
FROM
user
GROUP
BY
user.name
ORDER
BY
COUNT(id)
DESC
LIMIT
10;
4.
試してみよう
• 従業員数ランキング
– SELECT
company.id,
company.name,
COUNT(user_employment.id)
FROM
user_employment
LEFT
JOIN
company
ON
user_employment.company_id
=
company.id
GROUP
BY
company.id
ORDER
BY
COUNT(user_employment.id)
DESC
LIMIT
10;
• 企業の従業員一覧
– SELECT
user.id,
user.name
FROM
user
LEFT
JOIN
user_employment
ON
user.id
=
user_employment.user_id
LEFT
JOIN
company
ON
user_employment.company_id
=
company.id
WHERE
company.name
=
'Google';
• 共通の友達
– SELECT
*
FROM
friend
AS
f1
LEFT
JOIN
friend
AS
f2
ON
f1.friend_id
=
f2.user_id
WHERE
f1.user_id
=
'109092915251428393573'
AND
f2.friend_id
=
'113100517422007103669'
5.
想像してみよう
Id
name
gender_id
lang
created_at
1
佐藤太郎
1
ja
2011-‐01-‐01
22:32:44
2
鈴木花子
0
en
2011-‐01-‐01
23:32:44
3
山田二郎
1
id
2011-‐01-‐03
22:32:44
4
天野仁史
1
zh-‐cn
2011-‐01-‐05
22:32:44
5
飯塚修平
1
zh-‐tw
2011-‐01-‐06
22:32:44
…
…
…
…
123013810
猫ひろし
1
en
2011-‐12-‐31
22:32:44
SELECT
*
FROM
user
WHERE
created_at
<
'2011-‐08-‐01'
LIMIT
10;
6.
想像してみよう
Id
name
gender_id
lang
created_at
1
佐藤太郎
1
ja
2011-‐01-‐01
22:32:44
10
件見つかるま
2
鈴木花子
0
en
2011-‐01-‐01
23:32:44
で探すぜ!
3
山田二郎
1
id
2011-‐01-‐03
22:32:44
4
天野仁史
1
zh-‐cn
2011-‐01-‐05
22:32:44
5
飯塚修平
1
zh-‐tw
2011-‐01-‐06
22:32:44
…
…
…
…
123013810
猫ひろし
1
en
2011-‐12-‐31
22:32:44
SELECT
*
FROM
user
WHERE
created_at
<
'2011-‐08-‐01'
LIMIT
10;
遅いよね
7.
想像してみよう
8
Id
name
2
分木で 2
分探 gender_id
lang
created_at
1
佐藤太郎
1
ja
2011-‐01-‐01
22:32:44
索するぜ!
2
鈴木花子
0
en
2011-‐01-‐01
23:32:44
4
12
3
山田二郎
1
id
2011-‐01-‐03
22:32:44
4
天野仁史
1
zh-‐cn
2011-‐01-‐05
22:32:44
2
6
5
飯塚修平
1
zh-‐tw
2011-‐01-‐06
22:32:44
…
…
…
…
123013810
猫ひろし
1
en
2011-‐12-‐31
22:32:44
SELECT
*
FROM
user
WHERE
created_at
<
'2011-‐08-‐01'
LIMIT
10;
あたまいいね
10.
EXPLAIN
• select_type
– サブクエリの種類
– DEPENDENT
SUBQUERY,
UNCACHEABLE
SUBQUERY
は要改善
• type
– const
• primary
key
や unique
index
を探索に使う
– eq_ref
• JOIN
に primary
key
や unique
index
を使ってる
– range
• インデックスを使った範囲
– ref
• インデックス使ってる
– index
• フルインデックススキャン。要改善
– ALL
• フルテーブルスキャン。要改善
• key
– 実際に使われるインデックス
11.
DEPENDENT
SUBQUERY
• WHERE
IN
(SUBQUERY)
は遅い
– このクエリが
• SELECT
user_id
FROM
friend
WHERE
user_id
IN
(SELECT
friend_id
FROM
friend
WHERE
user_id
=
'
109092915251428393573
')
AND
friend_id
=
'
113100517422007103669';
– 以下のクエリに変更される
• SELECT
user_id
FROM
friend
AS
f1
EXISTS
(SELECT
1
FROM
friend
AS
f2
WHERE
f2.user_id
=
'
109092915251428393573
'
AND
f2.friend_id
=
f1.user_id)
AND
f1.friend_id
=
'113100517422007103669';
• hmp://nippondanji.blogspot.com/2009/03/
mysql_25.html
を参考に