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 秒)
激早。。
解決。