はじめまして。よろしくお願いします。
下記の場合、Using temporary; Using filesort を回避するには
どうしたらよいでしょうか。
次の 2 つのテーブルがあります。
CREATE TABLE `test1` (
`f1` int(11) NOT NULL,
`f2` int(11) NOT NULL,
PRIMARY KEY (`f1`,`f2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test1` VALUES ('1', '2');
INSERT INTO `test1` VALUES ('1', '3');
INSERT INTO `test1` VALUES ('1', '4');
INSERT INTO `test1` VALUES ('2', '1');
INSERT INTO `test1` VALUES ('2', '3');
CREATE TABLE `test2` (
`f1` int(11) NOT NULL,
`f2` varchar(20) default NULL,
`f3` varchar(20) default NULL,
PRIMARY KEY (`f1`),
KEY `ix_f2_f3` (`f2`,`f3`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `test2` VALUES ('1', 'A', 'a');
INSERT INTO `test2` VALUES ('2', 'B', 'b');
INSERT INTO `test2` VALUES ('3', 'C', 'c');
INSERT INTO `test2` VALUES ('4', 'D', 'd');
次の SELECT を実行すると Using temporary; Using filesort が
現れてしまいます。
explain select test2.f2, test2.f3
from test1, test2
where test1.f1 = 1 and test1.f2 = test2.f1
order by test2.f2, test2.f3;
order by ... をなくすと問題ないのですが、ソートは必要です。
複数のキーに対してORDER BYを実行する場合
インデックスを使用できないとあるので
ix_f2_f3 は使用されず Using filesort となるのはわかるのですが、
Using temporary となる理由と回避方法がわかりません。
ご教示よろしくおねがいいたします。
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
アドバイスが無駄になる可能性があるので、バージョンを明記してください。
MySQL4やMySQL5といった書き方でなく、少なくともMySQL 4.0、4.1、5.0といったことを明記願います。この回答への補足
この掲示板に不慣れなためどこに書いたらいいかわからないので
ここに書きます。自己レスです。
その後、開発中のテーブルにテストデータをある程度流し込んだところ、
インデックスが使用されるようになりました。
なので、投稿したテスト用テーブルにも
test1: 300 * 300 = 90,000 件の組み合わせ
test2: 300 件
を挿入して確認したところ、インデックスが使われるようになったようです。
+----+-------------+-------+--------+----------
| id | select_type | table | type | possible_keys
+----+-------------+-------+--------+----------
| 1 | SIMPLE | test2 | index | PRIMARY
| 1 | SIMPLE | test1 | eq_ref | PRIMARY
+----+-------------+-------+--------+----------
+----------+---------+-------------------------+------+-------
| key | key_len | ref | rows | Extra |
+----------+---------+-------------------------+------+-------
| ix_f2_f3 | 126 | NULL | 300 | Using index |
| PRIMARY | 8 | const,*******.test2.f1 | 1 | Using index |
+----------+---------+-------------------------+------+-------
投稿記事では数件の INSERT としていましたが、
開発中のテーブルでは数百件のデータを対象にしていたのですが、
オプティマイザにとっては少なすぎたということでしょうか?
MySQL の本格的な最適化は今回が初めてなのですごく苦労しています。
回答ありがとうございます。
まだ開発環境ですが、5.0.15-nt になります。
実行環境は少なくともこれ以上のバージョンで
OS は Linux になる予定ですが、
こちらはまだ用意していません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- PHP php エラー 2 2022/10/23 16:43
- 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
- 数学 「FFTの基本は、DFTはサンプル数Nが偶数なら 2つのDFTに分解できるということ。 分解するとD 3 2022/03/31 21:01
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- PHP ここで言う「アロー演算子」の役割を教えてください。 1 2022/03/26 02:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
通し番号が一番若いレコードの削除
-
固定長のデータをmysqlで取り込...
-
エラーをいくらチェックしてもD...
-
次の時間帯の勝率の合計を求め...
-
集計でテストの各教科の最高得...
-
IDとパスワードについて。
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
pandasでsqlite3にテーブル作成...
-
テーブル名が可変の場合のクエ...
-
フラグをたてるってどういうこ...
-
エラーを起こす方法
-
PostgreSQLのtimestamp型で時間...
-
テーブル定義書(Oracle) 【IX】...
-
ACCESS テキストボックスに入...
-
ExcelのMatch関数のようなもの...
-
プログラムよりファンクション...
-
SELECT文の結果をDEFINEの値と...
-
sqlに記述できない文字
-
SELECTした結果に行番号を求めたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
集計でテストの各教科の最高得...
-
MySQLで数字の値のもののみを取...
-
文字列を追加してUPDATEしたい
-
次の時間帯の勝率の合計を求め...
-
固定長のデータをmysqlで取り込...
-
エラーをいくらチェックしてもD...
-
Using temporary; Using fileso...
-
フラグをたてるってどういうこ...
-
SELECT INTOで一度に複数の変数...
-
【SQL】他テーブルに含まれる値...
-
sqlに記述できない文字
-
UPDATEで既存のレコードに文字...
-
テーブル名が可変の場合のクエ...
-
エラーを起こす方法
-
オラクルのUPDATEで複数テーブル
-
truncate tableを使って複数の...
-
結合したテーブルをSUMしたい
-
Accessで今日から5日後
-
既存データをINSERT文にして出...
-
timestampのデータはどのように...
おすすめ情報