Operación de datos a nivel de mil millones de mongodb

Recientemente, debido a la relación comercial de la compañía, se necesitan datos de 300 w + todos los días, y los datos de 3000 w + durante el período pico de Double Eleven se consultan y se descargan rápidamente. En el proceso, las consultas son un dolor de cabeza porque la cantidad total de datos antiguos es de casi 320 millones Si la consulta es incorrecta, Mongodb se destruirá accidentalmente y será trágico eliminar la base de datos para ejecutarla.

Condiciones basicas:

Proyecto SpringBoot

Introducir dependencias:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

// application.yml引入配置
data:
  mongodb:
    uri: mongodb://root:123565@localhost:27017/admin

Dificultades:

  • Optimización de consultas
  • Optimización del almacenamiento de datos.
  • Programación asincrónica de seguridad de datos

Esquema:

  1. La consulta debe sincronizar la cantidad total de datos.
  2. Pregunta si Mysql está particionado en el día
  3. Consultar según las condiciones de la fecha y agrupar por comerciantes, usuarios y lotes
  4. Realice una consulta condicional en el comerciante final, el usuario, el lote y la fecha para calcular el número total del lote que se sincronizará (num)
  5. Realice una consulta condicional en su comerciante final, usuario, lote y fecha para ordenar por id (solo se necesita una consulta, el foco está en: ordenar en orden ascendente según la id )
  6. Use la paginación para consultar el número de consultas por página y luego sincronizar, por ejemplo (pageSize = 1w, necesita sincronizar pageCount = num / pageSize +1)
  7. Use la consulta de paginación pero no use la consulta de salto + límite (si los datos de salto + límite son grandes, se producirá un tiempo de espera de conexión mongodb, no se pueden realizar otros servicios de consulta), porque la eficiencia de salto es demasiado baja, use más que la identificación actual y limite el tamaño de página para la consulta
  8. Antes de cada consulta de Identificación consulta de actualización para los datos de los últimos datos de identificación ser reemplazado

Debido a que involucra la seguridad de la compañía, solo se puede proporcionar una parte del código (=. =)

La eficiencia de almacenamiento de consultas de una sola tabla de sincronización de datos es (10w + / minuto)

Operación mongodb

1. Condición + consulta grupal

Criteria criteria = new Criteria();
criteria.andOperator(
    Criteria.where("createDate").gte(new Date(startDate)),
    Criteria.where("createDate").lt(new Date(endDate))
                );
Aggregation aggregation = Aggregation.newAggregation(
                    Aggregation.match(criteria),
                    Aggregation.group("userId").count().as("count")
            ).withOptions(AggregationOptions.builder().allowDiskUse(true).build());
List<Map> list = mongoTemplate.aggregate(aggregation, item, Map.class).getMappedResults();

2. Consulta básica de múltiples condiciones

Criteria criteria = new Criteria();
// 等于条件     (mysql:=)
criteria.and("userName").is(queryForm.getUserName());
// 模糊条件查询  (mysql:like ('%content%'))
criteria.and("content").regex(queryForm.getContent(), "i");
// 大于等于条件  (mysql:>=)
criteria.and("createDate").gte(DateUtil.beginOfDay(queryForm.getStartDate()));
// 小于等于条件  (mysql:<=)
criteria.and("createDate").lte(DateUtil.endOfDay(queryForm.getEndDate()));
// 分页查询
int start = (pageNum - 1) * pageSize;
int limit = pageSize;
Query query = new Query(criteria).with(Sort.by(Sort.Direction.DESC, "createDate")).skip(start).limit(limit);

 

Publicado 25 artículos originales · Me gusta9 · Visita 460,000+

Supongo que te gusta

Origin blog.csdn.net/qq_31150503/article/details/105451876
Recomendado
Clasificación