- ベストアンサー
MySqlでのデータソートについて
- MySqlでのデータソートにおいて、EXPLAINの結果で「Extra: Using where; Using filesort」が発生する問題について解決方法を探っています。
- 現在のテーブル構造では、複合インデックスを使用せずに「Using filesort」を発生させなくする方法を模索しています。
- テーブル全体のデータが1億件であり、1userあたり100~200件を想定しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>10数件のインデックスを張ったテーブルは普通に運用できるものなのでしょうか……? >または、「Using filesort」は大きな問題ではないと考えたほうがよいのでしょうか? インデックスを貼るとデータの追加、削除のスピードは落ちます。 よって検索と更新、どちらを頻繁にするかということも関連してきます。 私が持っているデータで言えば、20年前のアメリカ某大手の大型コンピュータで 1万件をソートして50秒というのがありました。 顧客が電話で問い合わせてくるものに対してデータを表示するソフトでしたので、 50秒は待てないと言われました。 問い合わせのパターンを絞ってもらってインデックスを10個作成して検索したら3秒になりました。 サーバーの処理能力にもかかってきますが、1億件を考えるとテストで打ち込んでも タイムアウトするか、しばらくそのサーバーを専有してしまうかもしれません。 (他のすべての処理を止めかねない)
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
where句に利用するカラムとorder by句で利用するカラムを複合インデックスしないと order by にインデックスは利用されません。 https://dev.mysql.com/doc/refman/5.1/ja/order-by-optimization.html 今回の命題であれば 10個のカラムにまたがるインデックスではなく userとprm1,userとprm2,・・・ という感じで個別に貼っていけばよいでしょう
補足
早速のご回答、誠にありがとうございます。 「10件を超える複合インデックスを張る事は避けたい」とは、 下記の様な大量のインデックスを作成する事を避けたいという旨のつもりでした。 ---------- ALTER TABLE tbl ADD INDEX idx1(user,prm1); ALTER TABLE tbl ADD INDEX idx2(user,prm2); … ALTER TABLE tbl ADD INDEX idx[n](user,prm[n]); ---------- 理由は、INSERT,UPDATEのパフォーマンスの低下を懸念しての事です。 とはいえ、いろいろ調べてみても、インデックスの張りすぎは パフォーマンスの低下をまねくとしか書かれておらず、 具体的にどの程度の負荷となるかは分かっていません。 10数件のインデックスを張ったテーブルは普通に運用できるものなのでしょうか……? または、「Using filesort」は大きな問題ではないと考えたほうがよいのでしょうか? こちらも、いろいろなサイトで避けるべき項目として記載されていましたので。
- maiko0318
- ベストアンサー率21% (1483/6969)
できません。ORDER BY 句に従ってインデックスが必要になります。 インデックスを張って事前にソートしておくか、はらずに実行時にソートするかの2択です。
補足
ご回答、ありがとうございます。 検索が多くなりがちになりますが、 更新もそれなりに頻繁に行うことになると思います。 現在、テスト環境で、総データ約1千万、1user約100件のテーブルを作成しテストしていますが、 「Using where; Using filesort」は出るものの、約0.001秒で応答が返ってきています。 ---------------- EXPLAIN実行結果 id: 1 select_type: SIMPLE table: tbl type: ref possible_keys: ref key: PRIMARY key_len: 4 ref: const rows: 96 Extra: Using where; Using filesort ---------------- サーバーの性能や、ユーザー数・同時接続数等を見つつ 調整を行っていくしかないかなと、ひとまず納得する事にいたしました。