Upload
masahiro-nagano
View
1.538
Download
0
Embed Size (px)
Citation preview
サイドバーの攻略• 割と重めなクエリをキャッシュしたい
• ページまるごとキャッシュはNG
• 1秒で”どこか”のページに確認が行われる
• キャッシュの”単位”を考える
SELECT a.id, a.title FROM comment c INNER JOIN article a ON c.article = a.idGROUP BY a.id ORDER BY MAX(c.created_at) DESC LIMIT 10
購入トランザクション$dbh->begin_work;$dbh->query('INSERT INTO order_request (member_id) VALUES (?)',$member_id);my $order_id = $dbh->last_insert_id;my $rows = $dbh->query( ‘UPDATE stock SET order_id = ? WHERE variation_id = ? AND order_id IS NULL ORDER BY RAND() LIMIT 1', $order_id, $variation_id,);if ($rows > 0) { my $seat_id = $dbh->select_one( 'SELECT seat_id FROM stock WHERE order_id = ? LIMIT 1', $order_id, ); $dbh->commit;} else { $dbh->rollback;}
わざと複雑に書いた
購入トランザクション1.購入履歴テーブルへのinsert。
auto_incrementのidがorder_idとなる
2.在庫テーブルをORDER BY RAND() LIMIT 1で更新
3. order_idを使い在庫テーブルから席番号を引く
トランザクションを無くす• Redisを使う
1. order_idは INCR で生成
2. 予めランダムに並べられた席番号リストから LPOP
3. MySQLの 購入履歴テーブル、在庫テーブルの更新
データの量と難易度• データ量が少なければ問題とはならない
• 実際のサービスと同じ
• データ量を変えながら、問題の難しさをある程度調整していた
• 開催直前にデータ量を変更し、特別賞のラインが想定とずれることも
• 参加者の方に楽しんで貰えるように