質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

996閲覧

このクエリが遅い理由がわかりません。

BKG

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/07/30 12:25

編集2020/07/30 12:41

下記のクエリで

users.deleted_at IS NULL」 が2つあり、重複した条件のため遅くなっているようです。
片方消すと一瞬でクエリが完了します。

重複した条件がWHERE句に存在するとき、どういう風に探し行ってなぜ時間がかかってるのかがわかりません。
どなたかご教示いただけると幸いです。

※ここで対象にするUsersは5万件になります

select count(*) from `users` where `users`.`id` IN( SELECT `tweets`.`tweet_id` FROM `tweets` WHERE `tweets`.`type` = 2 ) AND `users`.`company_id` = 193 AND `users`.`deleted_at` IS NULL AND `users`.`deleted_at` IS NULL ; => 50000

Railsのタグを入れているのは下記が理由です。

Rails5にしてからwhere句の条件が重複した条件でも愚直にクエリに追加されるように見えました。
記事など探しても該当する情報を見つけられなかったので勘違いかも知れませんが、そのような変更があった、などの情報あれば教えて欲しいです。

Mysqlのバージョンも5.6から8.0に上げているのでそのせいもあるのかも知れませんが、、

#Rails 4のとき Users.where(id: 1).where(deleted_at: nil).where(deleted_at: nil).count =>SELECT COUNT(*) FROM `users`  WHERE `users`.`id` = 1 AND `users`.`deleted_at` IS NULL #Rails 5のとき Users.where(id: 1).where(deleted_at: nil).where(deleted_at: nil).count =>SELECT COUNT(*) FROM `users`  WHERE `users`.`id` = 1 AND `users`.`deleted_at` IS NULL AND `users`.`deleted_at` IS NULL

gem paranoia と scope使ったときなどに条件が重複してしまってクエリが遅くなったりと困っています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/30 20:46

どういうデータに対しどういう結果を得たいのか記載した方が良いかと思います。 「遅い原因」を探るのではなく「SQLの最適化」を観点においたほうが有益な回答を得られると思います。
BKG

2020/07/31 02:38

ご回答頂きありがとうございます。 目的を書けばよかったです。失礼しました。 最適化という意味であれば根本を直すことなのですが、 影響範囲が広すぎて直すことが現状できない状態です。 色々なところで発生(条件が重複)しているのですが、遅い場合とそうじゃない場合があり 影響範囲を特定するために遅い原因を探っていました。
guest

回答2

0

ベストアンサー

テーブルの構造やMySQLのバージョン、エンジンによるのかもしれませんが
通常オプティマイズされて同じ条件は間引かれると思います。
NULLチェックやINは昔から鬼門なので、それを利用しない方法を考えたほうが早いかもしれません

投稿2020/07/30 12:38

yambejp

総合スコア115008

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

MySQL 遅いSELECT文の原因を調査する explain
で両方の実行計画を質問に追記しては?

その前に、

users.deleted_at IS NULL」 が2つあり、

という愚かな記述に拘るのはさっさと止めて、もっと優先度の高い問題に精力を費やす方が吉です。

投稿2020/07/30 13:17

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BKG

2020/07/31 02:39

正論ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問