mysqlのチューニング。order by が悪いわけではなかった・・。

サイトのデータ件数が、8万件を超えてきて、
パフォーマンスも気になってきた今日この頃。

数個SQLを実行してみると、
どうやらdateでorder byするSQLが重い様子。

explain
select
*
from
clip_bookmark,m_bookmark_genre
where
clip_bookmark.bookmark_genre_code = m_bookmark_genre.bookmark_genre_code
order by clip_bookmark.data_acquire_date desc limit 10

とやると・・。


表示中の列 0 - 9 (10 合計, クエリの実行時間 3.4817 秒)

激重!!

m_bookmark_genre ALL NULL NULL NULL NULL 10 Using temporary; Using filesort
clip_bookmark ref bookmark_genre_code bookmark_genre_code 5 m_bookmark_genre.bookmark_genre_code 5312 Using where


http://d.hatena.ne.jp/rti7743/20080629#

によると、order by が悪いんでなくて、
インデックスを張ってないカラムをselectすることが駄目らしい。
結果2つのSQLにわけてPHP側で処理することに・・。

select
clip_bookmark_code
from
clip_bookmark,m_bookmark_genre
where
clip_bookmark.bookmark_genre_code = m_bookmark_genre.bookmark_genre_code
order by clip_bookmark.data_acquire_date desc limit 10

で、まずインデックスを張ったキーを取得し、下で詳細情報を取得する・・

select
*
from
clip_bookmark,m_bookmark_genre
where
clip_bookmark.bookmark_genre_code = m_bookmark_genre.bookmark_genre_code
and clip_bookmark_code in (48171,
152449,
155844,
155817,
155825,
)

な感じで出すと・・・

表示中の列 0 - 9 (10 合計, クエリの実行時間 0.4953 秒)+
表示中の列 0 - 9 (10 合計, クエリの実行時間 0.0160 秒)

激早。。
解決。