• ベストアンサー

MySQLでtypeがALLを変更したい

恐れ入ります。 データ量が増えてしまい、適切なインデックスを作成するということで、EXPLAINでselect文を見ると、typeがALLとなって全文検索になっているとのことでした。このtypeを適切なものに変更したいのですが、どのようにしたらよいでしょうか。ご教授いただけたら有難いです。 よろしくお願いいたします。

  • MySQL
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • merrysun
  • ベストアンサー率27% (1167/4305)
回答No.1

MySQLで運用中のシステムにSQLチューニングする方法~ボトルネックを発見せよ~ https://beyondjapan.com/blog/2016/08/mysql-tuning-bottleneck/ MySQLで運用中のシステムにSQLチューニングする方法 その2 ~SQL解析~ https://beyondjapan.com/blog/2017/03/mysql-tuning-analyzesql/

spider32
質問者

お礼

詳しい情報ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • EXPLAINのtypeがALLのときの対応方法

    先日問い合わせたSQLの高速化についてEXPLAINについて教えて頂きました。 そのEXPLAINについて調べながら試していくと、同じphpファイル内で動かしている いくつかのSQL文に対してEXPLAINのtypeがALLとなっていたので対応すべき SQLだとは分かったのですが具体的にどのようなSQL文に書き換えればいいか 分からなかったので再度質問しました。 前提としてWORDPRESSでSQLをPHPファイル内で$wpdb->get_results関数を使って 実行しています。 (例1) 条件一致した件数を求めるSQL SELECT a_mst.a_id FROM a_mst WHERE a_mst.a_price >= 100 AND a_mst.a_price <= 200 AND a_mst.a_print_flg = 0 SQLのSELECT にCOUNT等は使わない方がいいようなので主キーのみを出力させて count関数で件数を求めています。 このSQL文をEXPLAINでphpMyadminで実行すると id=1       select_type=SIMPLE   table=a_mst type=ALL    possible_keys=NULL   key=NULL key_len=NULL  ref=NUL          rows=a_mstに登録してある件数 Extra=Using where でした。SQL文自体はあるマスタにあるデータから値が100~200のもので、フラグが0のものを 出力するというシンプルなSQL文なのでどう改善すればよいのでしょうか? (例2) 2つのテーブルを結合させて条件一致したデータをそれぞれテーブルから出力 SELECT a_mst.a_name, a_mst.a_price, b_mst.b_data FROM a_mst, b_mst WHERE a_mst.a_id = b_mst.b_id AND a_mst.a_price >= 100 AND a_mst.a_price <= 200 AND a_mst.a_print_flg = 0 ORDER BY a_mst.a_price , a_mst.a_id asc LIMIT 20 OFFSET 0 です。a_mstとb_mstをidで結合させて条件一致したあとにそれぞれの テーブルデータをSELECTしています。実際のSQL文はSELECT させている項目数は多いです。 このSQL文をEXPLAINでphpMyadminで実行すると <1行目> id=1       select_type=SIMPLE    table=b_mst type=ALL    possible_keys=PRIMARY key=NULL key_len=NULL  ref=NUL          rows=a_mstに登録してある件数 Extra=Using temporary; Using filesort <2行目> id=1        select_type=SIMPLE    table=a_mst type=eq_ref    possible_keys=PRIMARY  key=PRIMARY key_len=NULL   ref=b_mst.b_id       rows=1 Extra=Using where でした。 EXPLAINを使ったチューニングなどしたことないSQL低級者なのでどのようなSQL文にすればtypeがALLの場合や、ExtraからUsing temporary; Using filesortを消すことができるのか分からないので教えて下さる方がいましたらよろしくお願いします。 ちなみに、a_mstとb_mstはphpMyadminにてそれぞれのテーブルの「構造」を見ると 「インデックスサイズ」のところで、それぞれの主キーであるa_idとb_idがPLIMARY で登録させています。編集ボタンを押したら「インデックスを修正する」画面に変わるので一応それぞれインデックス登録はされているのかな?と思います。

  • MySQLでFullTextインデックスの再構築

    現在Webアプリを制作しています。 そこで検索機能を作成するにあたり FullTextで全文検索を行う処理を考えています。 Like文を使って検索するより速いらしいのですが、 insert/update文を実行しデータベースにデータを挿入/更新する際 FullTextで全文検索を行う場合だとインデックスを再構築する必要が あるみたいです。 http://melrose.jugem.cc/?eid=323 このインデックスの再構築についてよく分からないのですが、 上記のサイトではインデックスの再構築には REPAIR TABLE [テーブル名] QUICK; を実行とありました。 データの挿入/削除 処理後の検索インデックス修復には innsert 又は update文の直後にREPAIR TABLE [テーブル名] QUICK; を 実行するという事でいいのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLのインデックスについて

    MySQLのインデックスについて 検索画面で検索条件となるテキストフィールドが5つ(仮に住所、年齢、名前、電話番号、メールアドレス)あった場合全てのテキストに値を入力すると WHERE 住所 = 'XXXXX' AND 年齢 = XX AND 名前 = 'XXXX' AND 電話番号 = XXXX AND メールアドレス = 'XXXX' (Xは入力値) といった具合のSQL文になります。 最低でもどこかのテキストフィールドの1つが必須入力の場合、インデックスを貼るのであれば5つのフィールドのあらゆる組み合わせのインデックスを作成しなければならないので膨大なデータ量(1億件)がある場合はインデックスサイズも大きくなりますし、既に存在するデータに対してインデックス作成するのでそれだけで相当な時間がかかります。 しかしインデックスがないと検索に相当な時間がかかるのでインデックスはどうしても必要です。 こういった場合の対処法を教えてください。 MySQLはMyIsamを使ってます。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • UPDATEとSELECTのEXPLAINの違い

    UPDATE、SELECTで共に同一のテーブルの同一の主キーを指定したWHERE検索をEXPLAINで行ったところ、 SELECTに関してはtype値がconstになり、 UPDATEに関してはtype値がrangeになりました。 その他の違いといえば、UPDATEの場合はExtra値がUsing whereになるだけで、他は特に差異がありません。 UPDATEで変更する列にインデックスを作成してみても(WHEREで指定する列も含め)、やはりconstにはなりませんでした。 なぜこのような違いが発生するのでしょうか? また、UPDATEステートメントでもtype値をconstにするためにはどのようにすればよいでしょうか? よろしくお願いいたします。

  • mysqlにてselectの情報が欠けます。

    phpからselect文を使用した際、一部データが欠けるので、 もし何かお気づきの点があれば、ご指摘頂ければ幸いです。 使用しているもの。 php 5.6.14 mariadb-10.0.21-with-mroonga-5.08-winx64 ※一つのテーブルに向けてのselect文、エンジンはmroongaです。 cakephp 2.5系 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー cakePHPのモデルクラスから、 以下の様なプログラムを書いております。 $sql = "sql文です。※(select ………)"; $data = $this->query($sql); ※全文検索を使用するのでsql文直書きです。cakephp的な書き方がわからず。。あるのかな? あるカラムに例えばですが以下の様に入ってます。 ※emlのccやfromです。 佐藤<********@****.co.jp>,鈴木<********@****.co.jp> これをselectしてviewに表示すると佐藤、鈴木しか残らず、 残りが欠けてしまっております。 workbenchから同じクエリを打っても欠けている様には見えず、 どこで欠けているかわからず頓挫しております。 お気づきの点等あればご指摘を何卒宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • MySqlでのデータソートについて

    MySqlバージョン:5.1.61で、下記のSQLを実行すると、 1件しかデータが無いにも関わらず、EXPLAINの結果で 「Extra: Using where; Using filesort」が発生します。 ---------------- CREATE TABLE IF NOT EXISTS tbl ( user int(11) NOT NULL, item int(11) NOT NULL, prm1 int(11) NOT NULL, prm2 int(11) NOT NULL, prm3 int(11) NOT NULL, PRIMARY KEY (user,item) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO tbl (user,item,prm1,prm2,prm3) VALUES (1,1,10,10,10); EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm1; EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm2; EXPLAIN SELECT * FROM tbl WHERE user=1 ORDER BY prm3; ---------------- ORDER BY句で使用する項目(prm[n])は10項目以上になりますので 10件を超える複合インデックスを張る事は避けたいと考えております。 また、tbl全体のデータは1億件、1userあたり100~200件を想定しています。 複合インデックスを使用せず「Using filesort」を 発生させなくする事はできるのでしょうか?

    • ベストアンサー
    • MySQL
  • mysqlでyahooやgoogleのような検索スピードを出したい

    mysqlでyahooやgoogleのような検索スピードを出したい yahooやgoogleで検索するとどんなキーワードを入れても1秒以内に結果が返ってきます。 mysqlでデータ1000万件程度を想定してるのですが、いくらネットで調べて最適化したインデックスを貼っても全文検索にしてもyahooやgoogleのようにはいきません。 これは主にハード構成が主因となってるのでしょうか? サーバーを並列化するとかってのをネットで見ることもあるのですが具体的にどうなってるから速いのかよくわかりません。 そのあたりのご教授お願いします。

    • ベストアンサー
    • MySQL
  • 前方一致が動的に変更される場合にINDEXは有効になりません。

    いつもお世話になっております。 テーブル同士のLIKE検索(前方一致)を行った場合、 INDEXが有効になりません。 LIKE検索文字列を固定にした場合は、INDEXが有効 になります。 テーブル同士のLIKE(前方一致)でINDEXを 有効にする手段をご教授頂けないでしょうか。 以下、実行結果です。 (1)LIKE検索文字列が固定 ---------------------------------------------------------------------------- EXPLAIN SELECT * FROM wk_dss_data WHERE sys_id LIKE 'M004964%'; ---------------------------------------------------------------------------- Index Scan using i_wk_dss_data_02 on wk_dss_data (cost=0.00..5.25 rows=1 width=311) Index Cond: (((sys_id)::text >= 'M004964'::character varying) AND ((sys_id)::text < 'M004965'::character varying)) Filter: ((sys_id)::text ~~ 'M004964%'::text) (2)テーブル同士のLIKE検索 ---------------------------------------------------------------------------- EXPLAIN SELECT wk_dss_data.comp_id, wk_dss_data.user_id FROM wk_dss_data, t_update WHERE wk_dss_data.sys_id LIKE t_update.sys_id||'%'; ---------------------------------------------------------------------------- Nested Loop (cost=157.00..12505636.00 rows=2500000 width=20) Join Filter: (("outer".sys_id)::text ~~ (("inner".sys_id)::text || '%'::text) ) -> Seq Scan on wk_dss_data (cost=0.00..5479.00 rows=100000 width=31) -> Materialize (cost=157.00..207.00 rows=5000 width=11) -> Seq Scan on t_update (cost=0.00..157.00 rows=5000 width=11)

  • 検索ページでの、submitのコントロールについて

    イントラのFAQページに全文検索システムを作っています。 CGI(Namazu)を利用したこの検索環境は正常に動作していますが、この検索を実行するHTMLページの作成で悩んでいます。 以下が現在の検索用フォームです。 <form method="GET" action="/scripts/search/namazu.cgi.exe"> <select name="query"> <option value="分類アパッチ">Apache <option value="分類デスクネッツ">desknet's : </select> <input type="submit" name="idxname" value="Search!"> <input type="hidden" name="whence" value="0"> <input type="hidden" name="idxname" value="all"> </form> 上記は「『all』インデックスファイル内から、プルダウンで選択した項目のvalue値を検索」するためのフォームなのですが、結論としては、「検索者が任意に選択したインデックスから、プルダウンで選択したテキスト部(「Apache」や「desknet's」)を検索値として検索」するようにしたいのです。 以下のようなプルダウンにすることでインデックスを任意に選ぶことはできるのですが、そうすると、今度はどうやって検索値をCGIに送ることができるのかがわかりません。 <select name="idxname"> <option name="idxname" value="apache">Apache <option name="idxname" value="desknets">desknet's : </select> 分かり難い説明で恐縮ですが、どなたかご教示いただけますようよろしくお願いいたします。

  • PHPとMySQLによるデータ検索サイトを作ってます

    index.html(検索フォーム) list.php(検索結果表示ページ) 上記2ファイルでPHPとMySQLによるデータ検索サイトを作ってます。 初心者のため、勉強用に作ってます。 pearというライブラリを使用しないで以下の表現をするためにはどのようなコーディングが必要でしょうか? 参考になるサイトなどあればご教授ください。 PHPの上級者が見るようなマニュアルサイトだとその説明すら解読できない可能性があるので、噛み砕かれたサイトを探してます。 [知りたいこと] セレクト文で引っ張ってきたレコード数が25件として 検索結果表示ページには10件ごとに改ページさせたいです。 ↓このような改ページリンクを作りたいです。 [< 1 2 3 >] ↓またはこのようなリンクでもご教授いただけたら幸いです [前ページ│次ページ]

    • ベストアンサー
    • PHP