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

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

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

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

4回答

1386閲覧

LarabelのDB速度の向上させたい

yamayamak

総合スコア131

MySQL

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

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

2クリップ

投稿2018/01/23 09:11

LarabelのDB速度の向上させたいです。
DBの回答が遅いです。

以下のような書き方をしていますが、以下のような書き方だとLeftjoinを全てのデータで行ってから検索するのでしょうか?
DBを連携して、ここのフィールドを検索して結果を出力したいです。

すみませんが、DB速度向上に向けて、アドバイスをご教授下さい。

PHP

1$listpart = DB::table('tableA') 2 ->leftJoin('tableB', 'tableA.FieldB', '=', 'tableB.FieldB') 3 ->leftJoin('tableC', 'tableA.FieldC', '=', 'tableC.FieldC') 4if(!empty($s_word)){ 5 $listpart->where('tableA.FieldName', 'LIKE', "%{$s_word}%") 6 ->orWhere('tableB.FieldName', 'LIKE', "%{$s_word}%") 7 ->orWhere('tableC.FieldName', 'LIKE', "%{$s_word}%"); 8} 9$listpart = $listpart->select('FieldA', 'FieldB', 'FieldC', 10 DB::raw('AVG(eva_val) as rate_avg'), DB::raw('MAX(name) as name' ) ) 11 ->groupBy('FieldA', 'FieldB', 'FieldC') 12 ->orderBy('tableA.updated_at', 'desc') 13 ->take(30) 14 ->get();

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

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

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

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

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

guest

回答4

0

以下のような書き方をしていますが、以下のような書き方だとLeftjoinを全てのデータで行ってから検索するのでしょうか?

現状、実際に出力されているSQL全体が把握できていない状況が先にある場合は、まず以下の記事などを参考にしてデータベースアクセスのログを取り確認してみて下さい。
laravelのSQLのログの出し方
ライブラリとしては以下が使いやすく整えられています。
mnabialek/laravel-sql-logger
その後、他の回答者の方のLIKE文の改善の検討とともに、MySQLであれば、EXPLAIN構文などで実行計画を確認し、SQLやインデックスをより最適化できないか、データ取得で省けるものは無いかなどを検討してみて下さい。

投稿2018/01/23 10:48

編集2018/01/23 11:07
aro10

総合スコア4106

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

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

yamayamak

2018/01/23 11:23

ありがとうございます。ログを出力し検討したいと思います。 色々ありがとうございました。
guest

0

Likeはインデックスを貼っていたとしても、前方一致以外はインデックスが効きません。
おそらくそこが一番重たくなっていると思います。

  • like "%hoge%" => 効かない
  • like "%hoge" => 効かない
  • like "hoge%" => 効く

投稿2018/01/23 10:40

sakapun

総合スコア888

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

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

yamayamak

2018/01/23 11:22

ありがとうございます。なるほど、勉強になります。Likeの処理を見直します。ただ、前方一致以外も利用したいので、このような場合は仕方ないと考えるべきでしょうか? すみませんご教授頂けると幸いです・
yamayamak

2018/01/23 12:51

ありがとうございますm(_ _)m ただ、このような部分一致は世の中に結構あるのではと推測しましたがそうでもないのでしょうか? アプリでもよくある文字を入力して検索などは全て部分一致で検索されていると思います。。。 頂いたアドバイスを参考に製作させて頂きます。他にアドバイスがあればよろしくお願いします。
sakapun

2018/01/23 12:57

適材適所ですので、素のMySQLでは得意ではないことは確かです。 それが必須の機能ということであれば、それに適したDBにするか、キャッシュを活用するとか考えるでしょうが、必須ではないならある程度妥協する必要があるかと思います。
yamayamak

2018/01/23 13:02

ありがとうございます。なるほど、MySQLはそういうのはあまり利用されてないのですね。色々勉強になります。ありがとうございましたm(_ _)m
guest

0

どうしても文中に単語が含まれているかで絞り込みたいなら、DBに全文検索機能があればそれを使うのも手です

投稿2018/01/23 13:00

kero1209

総合スコア431

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

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

yamayamak

2018/01/23 13:01

ありがとうございます。調べてみます!
guest

0

ベストアンサー

①leftJoinに使われているFieldA、FiledB、FieldCにそれぞれインデックスは貼ってありますか?また、そのカラムはTEXT等の文字型ではありませんか?

LIKEは重い処理です。なので1回で済ませましょう。

PHP

1// 場合によってはFieldNameを「結合した結果、偶然s_wordとLIKE一致する」ことが発生するため注意 2if(!empty($s_word)){ 3 $listpart->where( 4 \DB::raw("CONCAT(tableA.FieldName, ',', tableB.FieldName, ',', tableC.FieldName)"), 5 'LIKE', 6 "%{$s_word}%"); 7}

投稿2018/01/23 10:12

masaya_ohashi

総合スコア9206

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

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

yamayamak

2018/01/23 11:20

ありがとうございます。勉強になります。Indexは設定できていません。設定します。 Indexは検索するフィールドを設定すべきと思いますが、幾つでも良いのでしょうか?
yamayamak

2018/01/23 11:20

mysql> show index from makers; +--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ | makers | 0 | PRIMARY | 1 | makerid | A | 40 | NULL | NULL | | BTREE | | | | makers | 0 | makers_maker_name_unique | 1 | maker_name | A | 40 | NULL | NULL | | BTREE | | | | makers | 1 | makers_f_userid_foreign | 1 | f_userid | A | 2 | NULL | NULL | | BTREE | | | +--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 3 rows in set (0.00 sec) mysql>
yamayamak

2018/01/23 11:20

これは3つ既に設定されているということでしょうか?すみません、教えて頂ければ幸いですm(_ _)m
masaya_ohashi

2018/01/24 00:48

> Indexは検索するフィールドを設定すべきと思いますが、幾つでも良いのでしょうか? いくつ付けてもよいのですが、あまり付けすぎると容量を食いすぎたりします。あと、INSERT等を行ったときの負荷も上がったりします。一般的な設定として、外部キー対象、ソート対象、検索対象のカラムにはINDEXを付けたほうがよいです。 > これは3つ既に設定されているということでしょうか? markersというテーブルはなんのことですか?tableAとかですか? とりあえず1番目のレコードはプライマリキー、2番めのレコードはユニークキー、3番目のキーは外部キーの情報です。それぞれ名前は違いますが、全部INDEX扱いです。 それぞれのテーブルで、FieldA、FieldB、FieldCにインデックスが貼られているかを確認してください。
sazi

2018/01/24 04:32

>masaya_ohashi さん >②LIKEは重い処理です。なので1回で済ませましょう。 結局インデックスがないならフィルターですから、CONCAT()しても大差無い気がするんですが、早くなるのを経験されたということでしょうか? concat()するとnull考慮も必要だし、3項目比較するのとどっちが高速なの?って気がします。
masaya_ohashi

2018/01/24 04:54

> sazi さん しっかり検証したわけではないですが、過去に一度やりました。しかし、当時は結局別の方法(というかロジック自体を変えた)ので、最終的にどっちが早かったかは自信がありません…
sazi

2018/01/24 05:36

>masaya_ohashi さん 了解しました。 concat()だとnull考慮とか、結合時の区切り文字(結合する文字に使用されていないもの)の選択が必要だったり、そちらの方が気になったので、それに見合う速度改善かどうかを確認したかったのです。
masaya_ohashi

2018/01/24 05:42

私がやった当時もCONCATはあんまり大きな改善ではなかったですね。それよりJOIN用のカラムにインデックス貼り忘れてたのを直したら劇的に早くなりました(当たり前)
yamayamak

2018/01/25 12:59

みなさん、色々ありがとうございます。 Joinしているところは基本的に外部キーになっているので、自動でIndexが作られていたようです。 問題はConcatのところをIndexを作成するかどうかですね。この部分は大きいので検討します。あと、Concatのところで区切り文字などが問題になるのは論理上、理解できますのでConcatする場合は気をつけたいと思います。 外部キーのところは自動でIndexが付いているようですので、ソート対象、検索対象にIndexを設定するように検討したいと思います。 色々ありがとうございました。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問