![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
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」を
発生させなくする事はできるのでしょうか?
No.3ベストアンサー
- 回答日時:
>10数件のインデックスを張ったテーブルは普通に運用できるものなのでしょうか……?
>または、「Using filesort」は大きな問題ではないと考えたほうがよいのでしょうか?
インデックスを貼るとデータの追加、削除のスピードは落ちます。
よって検索と更新、どちらを頻繁にするかということも関連してきます。
私が持っているデータで言えば、20年前のアメリカ某大手の大型コンピュータで
1万件をソートして50秒というのがありました。
顧客が電話で問い合わせてくるものに対してデータを表示するソフトでしたので、
50秒は待てないと言われました。
問い合わせのパターンを絞ってもらってインデックスを10個作成して検索したら3秒になりました。
サーバーの処理能力にもかかってきますが、1億件を考えるとテストで打ち込んでも
タイムアウトするか、しばらくそのサーバーを専有してしまうかもしれません。
(他のすべての処理を止めかねない)
この回答への補足
ご回答、ありがとうございます。
検索が多くなりがちになりますが、
更新もそれなりに頻繁に行うことになると思います。
現在、テスト環境で、総データ約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
----------------
サーバーの性能や、ユーザー数・同時接続数等を見つつ
調整を行っていくしかないかなと、ひとまず納得する事にいたしました。
No.2
- 回答日時:
where句に利用するカラムとorder by句で利用するカラムを複合インデックスしないと
order by にインデックスは利用されません。
https://dev.mysql.com/doc/refman/5.1/ja/order-by …
今回の命題であれば
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」は大きな問題ではないと考えたほうがよいのでしょうか?
こちらも、いろいろなサイトで避けるべき項目として記載されていましたので。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- MySQL SHOW CREATE TABLE posts;これって何ですか? 3 2022/08/28 22:57
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- PHP php エラー 2 2022/10/23 16:43
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- MySQL MySQLのテーブル作成で 自信がありません。 2 2022/08/28 05:35
- MySQL MYSQL エラー 2 2022/10/18 11:37
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複合インデックスの設定に関して
-
検索エンジン検索結果から削除...
-
社名でデータ抽出できる検索シ...
-
LIKEの右側にカラムを指定でき...
-
複数のフィールドの検索
-
mySQL プライマリーキーのカラ...
-
SELECT文で、指定カラム以外の...
-
mysqlで50音順にorder byしたい。
-
DBエラーの意味
-
前と後という言葉の意味
-
SQLでカラムを追加し、条件に合...
-
スペースによる絞り込み検索をS...
-
構造が異なる二つのテーブルをu...
-
DB2(OS/390)のSECQTYについて
-
type date にnullをinsert
-
インデックスとは?オートナン...
-
Accessで文字列の一部を抽出す...
-
INDIRECT関数の代替方法は?
-
最大2147483647なのに何故int(1...
-
MySQLで先頭にカラムを追加
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユニーク制約とユニークインデ...
-
オートインクリメントについて
-
MySQLのKey属性「MUL」について
-
複数カラム検索で、LIKE "%検索...
-
SQL Server Management Studio...
-
大量の項目を対象に効率的に検...
-
インデックスについて
-
UPDATEつてインデックス貼って...
-
MySQLのインデックスについて
-
1000件以下の場合はカラム数に...
-
MySqlでのデータソートについて
-
テーブル設計について。
-
インデックス作成について
-
文字検索 (LIKE)を使った場合
-
複合インデックスの設定に関して
-
インデックスを張るべき項目に...
-
検索エンジン検索結果から削除...
-
INDIRECT関数の代替方法は?
-
DBの定義のサイズを大きくし過...
-
SELECT文で、指定カラム以外の...
おすすめ情報