タイムライン取得処理 (プル型) をがんばって1ステートメントで書いてみる話

Kazuho@Cybozu Labs: フレンド・タイムライン処理の原理と実践
http://tt25.org/blog/20080609/sql-friend-timeline

tt25 さんに触発されて MySQL で 2 * n2 行のアクセスで (たぶん) 動くコードを書いてみた、けど、ストアドプロシージャを使うコードと速度は変わらなかったorz

SELECT message.id,message.user_id,message.body FROM message INNER JOIN (
  SELECT t.follower_id,t.max_id,IFNULL(
    (
      SELECT id FROM message WHERE user_id=t.follower_id
      ORDER BY user_id DESC,id DESC LIMIT 20,1
    ),
    0
  ) AS low_id
  FROM (
    SELECT follower_id,(
      SELECT id FROM message WHERE user_id=follower.follower_id
      ORDER BY user_id DESC,id DESC LIMIT 1) AS max_id
    FROM follower WHERE user_id=? ORDER BY max_id DESC LIMIT 20
  ) as t
) as t2 WHERE user_id=follower_id AND low_id<=id
ORDER BY id DESC LIMIT 20

ストアドプロシージャの並走性ってどうなんだっけ? ロックがかかるのはトリガーだけ?