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
を参考に