
mysqlのMyISAM型でこういったデータの取得は適切なやり方でしょうか。
・件数は700前後
・インデックスは主キー以外に使っていません
・トランザクションや外部キーも使っていません
SELECT * FROM tabledate WHERE 100<a AND 200>a AND 300<b AND 1000>b AND c='てすと' AND d='テテテ' AND e='testtest' AND f='ttt' AND g IN('123','456','789','122','333','4566','888') AND h IN('666','777') AND ・・・ANDが10個続く・・・ ORDER BY year_manth_day DESC
コマンドプロンプトで実行すると結果は0.12secでした。
自分のパソコンの中だけで動かしているのですが、
この実行時間は充分でしょうか。
No.4ベストアンサー
- 回答日時:
ALLの意味はインデックスをつけないといけないということではなくて、オプティマイザがフルテーブルスキャンをしたほうが効率的と判断したということですね。
例えインデックスがあってもフルテーブルスキャンをしたほうが効率的と判断されれば使われません。
また、possible_keysは今回の条件で使えるインデックスがなかったよ、という意味です。(WHERE句で指定していて、レコードの大部分が絞りこめるような列にインデックスを貼って試してみましたか?)
それと、Extraにfilesortが出ていますが、検索よりもソートの負荷の方が高いかもですよ。ケースによってはORDERBYを外してプログラムで処理した方が速いケースもあります。
(今回の場合は件数が少ないので大した違いはないでしょうが。)
しかし、データが最大で数百件程度ならな、それほどムキになって現在の実行時間を短縮する意味もないような気がします。
(現在の時間が半分になったとしても体感ではわからないレベルでしょう)
No.3
- 回答日時:
#1です
上限がきまっていて、負荷テスト段階で満足しているなら
とくに気にする必要はないでしょう。
2回目、3回目はキャッシュされているでしょうからあまり意味がないです
(普通に考えて何度も同じ条件で検索をかけることはないでしょうから)
No.2
- 回答日時:
定石ですがとりあえず、EXPLAINコマンドでオプティマイザがどういう順序でSQLを発行しているのか実行計画を見てみましょう。
その上でマニュアル上に書いてあるポイントで最適化を施せばとりあえず基準となるパフォーマンスのデータがとれるかと思います。下記リンクの特に「SELECTクエリーの速度」や「WHERE 節最適化」、「クエリパフォーマンスの推定」などの章を読んでみてください。
その上でまだコストがかかるようであれば、そのコストの掛かる部分について対応策を考えるのがよいかと思います。
SELECTおよびその他のステートメントの最適化
http://dev.mysql.com/doc/refman/5.1-olh/ja/query …
また、MySQL 5.6.3からは「Optimizer Tracing」というオプティマイザがどのような判断をしたかということが、トレースできる機能があるようです。
(実際に使ったことはありませんが)
実際のところ500いくかどうかだと思います。いっても700までです。早ければ今のままでいいかも。なので、まずないですが、もしそれ以上になりパフォーマンスに問題が出ればそのときに対処すればいいかと思っていました。速ければ負荷に問題がないですか?
1回目は2 rows in set (0.09 sec)
2回目以降は2 rows in set (0.01 sec)
でした。
EXPLAIN EXTENDEDで見てみると
+----+-------------+--------+------+---------------+------+---------+------+----
--+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+----
--+-----------------------------+
| 1 | SIMPLE | tabledate | ALL | NULL | NULL | NULL | NULL | 500 | Using where; Using filesort |
+----+-------------+--------+------+---------------+------+---------+------+----
--+-----------------------------+
ALLはインデックスをつけないといけないといことみたいで、
possible_keysでインデックスを指定すべきフィールドが分かるそうですが、
NULLになってしまいます。
No.1
- 回答日時:
>SELECT *
してる時点で、スピードに文句を言ってはいけません。
個人的な感想ですが、700件のデータで0.12秒もかかっていては
データ件数が増えたら使い物にならないと思います。
適当なインデックスを貼り、インデックスに基づいたフィールドのみ
表示する必要がありそうです
実際のところ500いくかどうかだと思います。いっても700までです。早ければ今のままでいいかも。なので、まずないですが、もしそれ以上になりパフォーマンスに問題が出ればそのときに対処すればいいかと思っていました。速ければ負荷に問題がないですか?
1回目は2 rows in set (0.09 sec)
2回目以降は2 rows in set (0.01 sec)
でした。
EXPLAIN EXTENDEDで見てみると
+----+-------------+--------+------+---------------+------+---------+------+----
--+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+------+---------------+------+---------+------+----
--+-----------------------------+
| 1 | SIMPLE | tabledate | ALL | NULL | NULL | NULL | NULL | 500 | Using where; Using filesort |
+----+-------------+--------+------+---------------+------+---------+------+----
--+-----------------------------+
ALLはインデックスをつけないといけないといことみたいで、
possible_keysでインデックスを指定すべきフィールドが分かるそうですが、
NULLになってしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DBの定義のサイズを大きくし過...
-
SQL、oracleにて文字列操作(連...
-
mySQL プライマリーキーのカラ...
-
他のシートの検索
-
INDIRECT関数の代替方法は?
-
SELECT文で、指定カラム以外の...
-
一部のカラムでdistinctし全て...
-
BULK INSERT時のNull許容について
-
ドロップダウンリストの連動し...
-
テーブルの列数を調べたい
-
betweenを使うyyyy/mm/ddでの範...
-
LIKEの右側にカラムを指定でき...
-
カラムとコラムの使い分け
-
ホームページを作ろうと思いま...
-
MYSQLで全てのカラムから検索す...
-
now()かCURRENT_TIMESTAMPか
-
sql , insert で空行(全ての列...
-
MySQL 一つのテーブルで登録日...
-
Accessで複数(3以上)...
-
WHEREなどの条件が多い場合、ど...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DBの定義のサイズを大きくし過...
-
PHPのforeachでSQL文を処理して...
-
SQL、oracleにて文字列操作(連...
-
ENUM列に列挙されていない値を...
-
インデックスキーを設定するとK...
-
mySQL プライマリーキーのカラ...
-
SQL Serverのntext型で一意イン...
-
SQLの高速化の方法について
-
パフォーマンスとIN句とAND、実...
-
効果的なindexの設定方法
-
(phpMyadminの)インデックスサ...
-
'PRIMARY KEY'と'UNIQUE()'の違...
-
属性?について
-
コンポジット一意インデックス...
-
インデックスの一意な値の数に...
-
インデックスを用いたbetween検...
-
Mysqlのconstraintについて教え...
-
他のシートの検索
-
SELECT文で、指定カラム以外の...
-
INDIRECT関数の代替方法は?
おすすめ情報