Имам някои заявки, които отнемат твърде дълго (300ms) сега, когато базата данни е нараснала до няколко милиона записа. За мое щастие заявките не трябва да разглеждат по-голямата част от тези данни, тези последни 100 000 записа ще са достатъчни, така че моят план е да поддържам отделна таблица с най-новите 100 000 записа и да изпълнявам заявките срещу това. Ако някой има някакви предложения за по-добър начин да направите това, ще бъде страхотно. Истинският ми въпрос е какви са опциите, ако заявките трябва да се изпълняват срещу историческите данни, каква е следващата стъпка? Неща, за които се сетих:
- Надстройте хардуера
- Използвайте база данни в паметта
- Кеширайте обектите ръчно във вашата собствена структура от данни
Верни ли са тези неща и има ли други варианти? Някои доставчици на БД имат ли повече функционалност от други, за да се справят с тези проблеми, напр. указване на определена таблица/индекс да бъде изцяло в паметта?
Съжалявам, трябваше да спомена това, използвам mysql.
Забравих да спомена индексирането в горното. Честно казано, индексирането беше единственият ми източник на подобрение досега. За да идентифицирам тесните места, използвах maatkit за заявките, за да покажа дали индексите се използват или не.
Разбирам, че сега се отдалечавам от това, за което беше предназначен въпросът, така че може би трябва да направя друг. Проблемът ми е, че EXPLAIN
казва, че заявката отнема 10 ms, а не 300 ms, което 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)