Tengo algunas consultas que tardan demasiado (300ms) ahora que el DB ha crecido a unos pocos millones de registros. Afortunadamente para mí las consultas no necesitan ver la mayoría de estos datos, los últimos 100.000 registros serán suficientes, así que mi plan es mantener una tabla separada con los 100.000 registros más recientes y ejecutar las consultas en contra de esto. Si alguien tiene alguna sugerencia para una mejor manera de hacer esto, sería genial. Mi verdadera pregunta es, ¿cuáles son las opciones si las consultas necesitan ejecutarse contra los datos históricos? ¿Cuál es el siguiente paso? Cosas que he pensado:He golpeado el cuello de botella de rendimiento DB, ¿dónde está ahora?
- de actualización de hardware
- Utilice una base de datos en memoria caché
- los objetos manualmente en su propia estructura de datos
Es esto correcto y hay alguna otra opciones? Algunos proveedores de DB tienen más funcionalidades que otros para tratar estos problemas, p. especificando una tabla/índice particular para estar completamente en la memoria?
Lo siento, debería haber mencionado esto, estoy usando mysql.
Olvidé mencionar indexación en lo anterior. La indexación ha sido mi única fuente de mejora hasta ahora para ser bastante honesto. Para identificar los cuellos de botella, he usado maatkit para que las consultas muestren si se están utilizando índices o no.
Entiendo que ahora me estoy alejando de lo que pretendía la pregunta, así que tal vez debería hacer otra. Mi problema es que EXPLAIN
está diciendo que la consulta tarda 10ms en lugar de 300ms que jprofiler está informando. Si alguien tiene alguna sugerencia, realmente lo agradecería. La consulta es:
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'
y la salida del EXPLAIN
es:
+----+-------------+-------------------------+-------------+---------------------------------------------+-------------------------+---------+------------------------------------------------+------+-------------------------------------------------------+
| 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)
¿Qué RDBMS estás usando? –
¿Dónde dice EXPLAIN PLAN que el cuello de botella es para sus consultas problemáticas? –
"así que mi plan es mantener una tabla separada con los 100.000 registros más recientes y ejecutar las consultas en contra de esto": parece una mala idea. –