サブクエリとLEFT JOINのパフォーマンス比較(集計編)

業務で集計処理を書く予定があるのですが、サブクエリとLEFT JOINのどちらを使って集計した方が良いのかを判断できませんでした。もちろん、データ量やデータ特性、トレードオフなどを踏まえて判断する必要がありますが、今後、同じような場面に遭遇した際にデファクトスタンダートとなるのはどちらかなのかをハッキリとさせておきたいです。
世の中には「推測するな。計測せよ」という言葉があるので、実際にサブクエリとLEFT JOINでそれぞれ集計処理を計測してみました。 結果的に今回のパターンではLEFT JOINの方がパフォーマンスが良かったです。

では、詳しく紹介していきます。

テーブル定義

以下のようなテーブルがあったとします。
ユーザーはポストを任意の数だけ投稿できるように、中間テーブルuser_postsを定義しています。

続きを読む

今更ながらHTTPのRFC(Status Code Definitions)を読んでみる

みなさんはRFC読んでますか...🤔
自分は普段、ガッツリと読む機会はないのですが、新しいプロトコルを触るような場合に読んだことがある程度です。
過去にWebSocketを使ってSlackライクなチャットアプリを作ったことがあるのですが、その際にWebSocketのRFCを読んだことを覚えています。
しかし、WEB開発において最も使用しているであろうHTTPプロトコルのRFCを読んだことはありませんでした。
直近でいくらかAPIを設計する予定があって「良い機会だな...」と思うので、HTTPのRFCを読んでみようと思います。
といっても、文量が多いため、まずはステータスに関する項目(Status Code Definitions)のみに絞りました。どのステータスがどのようなケースを想定して用意されているものなのか興味があります。

www.rfc-editor.org

内容を理解できるかは自信がありませんが、RFCにはどのようなことが書かれていたのかを紹介していきます。

続きを読む

sequelizeで全テーブルに対してTRUNCATEを実行する

業務でsequelizeというNode.js製のORMマッパーを触る機会がありました。
単体テストを実行する度に、データベース(MySQL)のテーブルをクリア(全削除)するために制約を無視してTRUNCATEを全テーブルに対して実行したいのですがsequelizeでは対応するメソッドは提供されていませんでした。

// 外部キー制約のあるデータが存在しているとエラーになる
await sequelize.truncate({ cascade: true, restartIdentity: true });

// テーブルに対応するモデル1つずつに対して実行する必要がある
await User.destroy({ truncate: true });

Model Querying - Basics | Sequelize

テーブルをドロップするという手もありますが、その後にテーブルを再作成・マイグレーションを実行する必要があるため非常にコストが高くなってしまいます。何とかならんものか...と悩んだ結果、生SQLを実行することにしました。
簡単に実行できるように関数化したので、同じ問題で困っている人がいれば使ってみてください。

続きを読む

【コピペでOK】はてなブログでソーシャルボタン一覧に「読者になる」を追加する

前回の記事でブログのデザインを一新したとお伝えしました。
その対応の一部として、はてなブログの「読者になる」ボタンをソーシャルボタンの一覧に表示するという対応を行なっています。 この位置を採用したのは、記事を読み終えた後にアクションを行うボタン群をまとめて表示したかったからです。

合わせてボタンは独自にカスタムしたものを採用しています。
というのも、はてなブログが提供している「読者になる」ボタンは何とも言えないデザインかつiframeのためサイズ調整などが難しいです。
さらにボタン右側には読者数が表示されるのですが都度、データを取得しているようで表示まで時間がかかってしまいます。ユーザーが「このブログの読者数を知りたい...」というケースよりも、早く「読者になる」ボタンが表示されて、読者になりたいと思ってくれるユーザーにストレスなく動線を提供できる方が重要だと思いました。
では、このボタンの作り方と配置の方法を紹介していきたいと思います。

続きを読む

Rubyの新たなテストフレームワークtldrの紹介

またもやRuby Weeklyで面白そうなgemが紹介されていました。
Ruby製の新たなテストフレームワークtldrというものです。すでにRspecやMinitestが人気を博している中、なぜ新しいテストフレームワークの実装を始めたのでしょうか。気になったので色々と調べつつ、試してみました。
なお、本記事で引用している内容は全て「The TLDR on Ruby's new TLDR testing framework」からの引用です。
tldrの作者であるジャスティンさんが投稿している内容なので、ぜひ合わせてご覧ください。

blog.testdouble.com

tldrのコンセプト

TL;DRは"Too Long, Didn't Read"の略語で、要約を表すスラングです。
このスラングをgem名に採用していることから察するものがありますが、tldrは1.8秒以内にテストが完了しないと爆発してしまいます💣...。
爆発という表現は一般的なテスト失敗(failure)とは異なっており、仮にテストが1.8秒以上を超過してしまった場合には「 your tests didn’t fail, you did.(テストが失敗したではなく、あなたが失敗したのだ)」と考えられています。

your suite crosses the 1.8 second threshold,
your test runner will be staring you in the face telling you that your tests didn’t fail, you did.

続きを読む