ここから本文です

Mysqlを使用しているのですが、下記のようなSQLを早くするには、どうすればよいの...

mom********さん

2015/1/522:04:51

Mysqlを使用しているのですが、下記のようなSQLを早くするには、どうすればよいのでしょうか?

SELECT SQL_NO_CACHE
d.name name, count(d.name) total,c.parent parent
FROM
wp_posts a,
wp_term_relationships b,
wp_term_taxonomy c,
wp_terms d,
wp_postmeta e
WHERE
a.post_status ='publish' AND
a.ID=b.object_id AND
a.ID=e.post_id AND
b.term_taxonomy_id=c.term_taxonomy_id AND
c.term_id=d.term_id AND
c.taxonomy='post_tag' AND
e.meta_key='hogekey' AND
e.meta_value='hoge' AND
GROUP BY
d.name
ORDER BY
count(d.name) DESC

閲覧数:
54
回答数:
2

違反報告

ベストアンサーに選ばれた回答

2015/1/622:06:28

提示されたSQLを、inner join を用いて書き換えると、以下のようになります。
(読みやすいように適宜空行を入れています。ちなみに、inner join で書いた方が、結合キーと抽出条件とが分離して読みやすくなるのでお勧めです)

SELECT SQL_NO_CACHE
d.name name, count(d.name) total,c.parent parent

FROM
wp_posts a

INNER JOIN wp_term_relationships b
on a.ID = b.object_id

INNER JOIN wp_term_taxonomy c
on b.term_taxonomy_id = c.term_taxonomy_id

INNER JOIN wp_terms d
on c.term_id = d.term_id

INNER JOIN wp_postmeta e
on a.ID = e.post_id

WHERE
a.post_status = 'publish' AND
c.taxonomy = 'post_tag' AND
e.meta_key = 'hogekey' AND
e.meta_value = 'hoge'

GROUP BY
d.name
ORDER BY
count(d.name) DESC

ここで、WHERE節で a,c,e のテーブルをそれぞれ絞っていますが、この絞られ度合い(たとえば100000件だったのが10件になる)によっては、
「結合してから件数を絞る」
のではなく、
「絞ってから結合する」
方が速くなることがあります。

SELECT SQL_NO_CACHE
d.name name, count(d.name) total,c.parent parent

FROM
(select * from wp_posts where post_status = 'publish') a

INNER JOIN wp_term_relationships b
on a.ID = b.object_id

INNER JOIN
(select * from wp_term_taxonomy where taxonomy = 'post_tag') c
on b.term_taxonomy_id = c.term_taxonomy_id

INNER JOIN wp_terms d
on c.term_id = d.term_id

INNER JOIN
(select * from wp_postmeta
where meta_key = 'hogekey' and meta_value = 'hoge') e
on a.ID = e.post_id

GROUP BY
d.name
ORDER BY
count(d.name) DESC

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

原沢信道さん

2015/1/610:34:19

特にHDDのアクセス速度の速い性能の良いマシンに変える事ですが、SQLでの対応は適切なインデックスを設定する事です、適切と言ってもSQLの書き方で使われるインデックスが異なるので、後はインデックスの設定とSQL文の組換えをしながら一番効果的なインデックスとSQL文を見つけ出す必要があります。どのインデックスがどう使われるかは頭で考えても解決しないので、実際に動かしてみるしかないと思います。少なくとも上のSQL文では、WHERE内で=で使われている列名をインデックス化すればかなり効果は出ます。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる