У меня есть некоторые запросы, которые занимают слишком много времени (300 мс) сейчас, когда база данных выросла до нескольких миллионов записей . К счастью для меня, запросы не нуждаются в просмотре большей части этих данных, последних 100 000 записей будет достаточно, поэтому мой план состоит в том, чтобы поддерживать отдельную таблицу с самыми последними 100 000 записей и запускать запросы против нее. Если у кого-то есть предложения по лучшему способу сделать это, было бы здорово. Мой реальный вопрос: каковы варианты действий, если запросы действительно должны выполняться против исторических данных, что делать дальше? Вещи, о которых я подумал:
Правильно ли это и есть ли другие варианты? У некоторых поставщиков БД больше возможностей, чем у других, для решения этих проблем, например указать, что конкретная таблица / индекс полностью находится в памяти?
Извините, я должен был упомянуть об этом, я использую mysql.
Я забыл упомянуть об индексировании выше. Пока честно говоря, индексирование было моим единственным источником улучшения. Чтобы определить узкие места, я использовал maatkit для запросов, чтобы показать, используются ли индексы.
Я понимаю, что сейчас я ухожу от того, для чего был предназначен этот вопрос, так что, возможно, мне стоит задать еще один. Моя проблема в том, что EXPLAIN
говорит, что запрос занимает 10 мс, а не 300 мс, о которых сообщает jprofiler. Если у кого-то есть предложения, я буду очень признателен. Запрос:
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)