DBが数百万レコードに成長したため、時間がかかりすぎる(300ミリ秒)クエリがいくつかあります。幸いなことに、クエリはこのデータの大部分を調べる必要はありません。最新の100,000レコードで十分なので、最新の100,000レコードを含む別のテーブルを維持し、これに対してクエリを実行する予定です。誰かがこれを行うためのより良い方法について何か提案があれば、それは素晴らしいことです。私の本当の質問は、クエリを履歴データに対して実行する必要がある場合のオプションは何ですか、次のステップは何ですか?私が考えたこと:
- ハードウェアをアップグレードする
- インメモリデータベースを使用する
- 独自のデータ構造でオブジェクトを手動でキャッシュします
これらは正しいですか、他にオプションはありますか?一部のDBプロバイダーは、これらの問題に対処するために他のプロバイダーよりも多くの機能を備えていますか?たとえば、特定のテーブル/インデックスを完全にメモリ内に指定するなどです。
申し訳ありませんが、私はこれについて言及する必要があります、私はmysqlを使用しています。
上記で索引付けについて言及するのを忘れました。正直なところ、これまでのところ、インデックス作成は私の唯一の改善の源です。ボトルネックを特定するために、インデックスが使用されているかどうかを示すクエリにmaatkitを使用しています。
私は今、質問の意図から離れていることを理解しているので、別の質問を作成する必要があるかもしれません。私の問題は、EXPLAIN
jprofilerが報告している300msではなく10msかかるということです。誰か提案があれば、本当にありがたいです。クエリは次のとおりです。
select bv.*
from BerthVisit bv
inner join BerthVisitChainLinks on bv.berthVisitID = BerthVisitChainLinks.berthVisitID
inner join BerthVisitChain on BerthVisitChainLinks.berthVisitChainID = BerthVisitChain.berthVisitChainID
inner join BerthJourneyChains on BerthVisitChain.berthVisitChainID = BerthJourneyChains.berthVisitChainID
inner join BerthJourney on BerthJourneyChains.berthJourneyID = BerthJourney.berthJourneyID
inner join TDObjectBerthJourneyMap on BerthJourney.berthJourneyID = TDObjectBerthJourneyMap.berthJourneyID
inner join TDObject on TDObjectBerthJourneyMap.tdObjectID = TDObject.tdObjectID
where
BerthJourney.journeyType='A' and
bv.berthID=251860 and
TDObject.headcode='2L32' and
bv.depTime is null and
bv.arrTime > '2011-07-28 16:00:00'
からの出力EXPLAIN
は次のとおりです。
+----+-------------+-------------------------+-------------+---------------------------------------------+-------------------------+---------+------------------------------------------------+------+-------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------------+-------------+---------------------------------------------+-------------------------+---------+------------------------------------------------+------+-------------------------------------------------------+
| 1 | SIMPLE | bv | index_merge | PRIMARY,idx_berthID,idx_arrTime,idx_depTime | idx_berthID,idx_depTime | 9,9 | NULL | 117 | Using intersect(idx_berthID,idx_depTime); Using where |
| 1 | SIMPLE | BerthVisitChainLinks | ref | idx_berthVisitChainID,idx_berthVisitID | idx_berthVisitID | 8 | Network.bv.berthVisitID | 1 | Using where |
| 1 | SIMPLE | BerthVisitChain | eq_ref | PRIMARY | PRIMARY | 8 | Network.BerthVisitChainLinks.berthVisitChainID | 1 | Using where; Using index |
| 1 | SIMPLE | BerthJourneyChains | ref | idx_berthJourneyID,idx_berthVisitChainID | idx_berthVisitChainID | 8 | Network.BerthVisitChain.berthVisitChainID | 1 | Using where |
| 1 | SIMPLE | BerthJourney | eq_ref | PRIMARY,idx_journeyType | PRIMARY | 8 | Network.BerthJourneyChains.berthJourneyID | 1 | Using where |
| 1 | SIMPLE | TDObjectBerthJourneyMap | ref | idx_tdObjectID,idx_berthJourneyID | idx_berthJourneyID | 8 | Network.BerthJourney.berthJourneyID | 1 | Using where |
| 1 | SIMPLE | TDObject | eq_ref | PRIMARY,idx_headcode | PRIMARY | 8 | Network.TDObjectBerthJourneyMap.tdObjectID | 1 | Using where |
+----+-------------+-------------------------+-------------+---------------------------------------------+-------------------------+---------+------------------------------------------------+------+---------------------------------------
7 rows in set (0.01 sec)