次のクエリを使用して、リーダーボードの位置の順にプレーヤーを選択し、その横に最新の投稿とそのプレーヤーに関連するいくつかの最新のストーリーを提供します。
SELECT players.player_name,
posts. * ,
GROUP_CONCAT( DISTINCT stories.story_title
ORDER BY stories.story_published DESC
SEPARATOR '[sep]' )
AS headlines,
GROUP_CONCAT( DISTINCT stories.story_link
ORDER BY stories.story_published DESC
SEPARATOR '[sep]' )
AS links
FROM players, player_stories, stories, posts, leaderboard
WHERE cs_player_id = player_id
AND cs_story_id = story_id
AND post_player = player_id
AND leaderboard.name = players.player_name
GROUP BY players.player_name
ORDER BY leaderboard.1 DESC , leaderboard.3 DESC , leaderboard.6 DESC , leaderboard.144 DESC
すべての _id フィールドに主キーがあり、結合で使用される他のすべてのフィールドにインデックスがあります。
しかし、読み込みが遅く、クエリごとに約 3 秒かかります。
すべてのフィールドは固定長 (VARCHAR または INT) です。
このクエリを最適化する方法はありますか?
編集: これは SQL Fiddle にあります: http://sqlfiddle.com/#!2/b55cf/1/0
私の実際の実装では、各テーブルに 1000 ~ 3000 行あることに注意してください。
EXPLAIN EXTENDED は次のようになります。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE player_stories index PRIMARY PRIMARY 8 NULL 1169 Using index; Using temporary; Using filesort
1 SIMPLE players eq_ref PRIMARY PRIMARY 4 player_stories.cs_player_id 1
1 SIMPLE leaderboard ref Bothnames,name name 152 func 1 Using where
1 SIMPLE posts ref uniqueLink,post_playeruniqueLink 4 players.player_id 24 Using where
1 SIMPLE stories eq_ref PRIMARY PRIMARY 4 player_stories.cs_story_id 1
Variable_name Value
bulk_insert_buffer_size 8388608
innodb_buffer_pool_awe_mem_mb 0
innodb_buffer_pool_size 8388608
innodb_log_buffer_size 1048576
join_buffer_size 131072
key_buffer_size 8384512
myisam_sort_buffer_size 8388608
net_buffer_length 16384
preload_buffer_size 32768
read_buffer_size 131072
read_rnd_buffer_size 262144
sort_buffer_size 2097144