Проблема производительности на монго с раскруткой Array of Strings - PullRequest
0 голосов
/ 28 ноября 2018

У меня проблемы с производительностью, я делаю раскрутку в массиве строк.По сути, мне нужно посчитать, сколько раз каждый элемент в массиве моего документа появляется.

Пример:

Док 1 [.... Facets: ["Academia", "Piscina", ""Кинотеатр "]]

Doc 2 [.... Грани: [" Academia "," Cozinha "," Cinema "]]]

Doc 3 [.... Грани: ["Купер "," Quadra de Futebol "," Cozinha "," Cinema "]] *

Итак, мой результат будет:

Академия: 2

Пишкина: 1

Кинотеатр: 3

Cozinha: 2

Quadra de Futebol: 1

Пример документа:

{ 
"_id" : ObjectId("5bab1d5e2172eda710338c5c"), 
"SiteID" : "VR_1038936695_1", 
"PriceSale" : 580000.0, 
"Title" : "Apartamento a Venda em Salvador, Pituba, 4 dormitórios, 2 suítes,         
4 banheiros, 2 vagas", 
"Description" : "Apartamento 44 dormitórios (sendo 2 suítes), banheiros, 2 
garagens, dependência de empregada, sala integrada à varanda.andar alto, 119 
mº. Condomínio com infraestrutura completa: Piscina, quadra poliesportiva, 
academia, salão de festas, brinquedoteca, parque infantil, salão de jogos, 
playground com bastante área. Localização: Próximo ao Hiper Ideal, escolas, 
faculdade, Mini Shopping, etc... <br> <br> OPORTUNIDADE!!! <br> <br> Agende 
Sua Visita!!! <br> <br> <br> - Ar Condicionado <br> - Móveis Planejados <br> 
- Portão Eletrônico <br> - Área de Serviço <br> - Cozinha <br> - Bares e 
Restaurantes <br> - Escola <br> - Farmácia <br> - Shopping Center <br> - 
Supermercado", 
"Link" : "https://www.vivareal.com.br/imovel/apartamento-4-quartos-pituba- 
 bairros-salvador-com-garagem-119m2-venda-RS580000-id-1038936695/", 
"QtyRoomsMin" : 4.0, 
"QtyRoomsMax" : 4.0, 
"QtySuitesMin" : 2.0, 
"QtySuitesMax" : 2.0, 
"QtyParkingSlotMin" : 2.0, 
"QtyParkingSlotMax" : 2.0, 
"AreaMin" : 119.0, 
"AreaMax" : 119.0, 
"QtyBathroomsMin" : 4.0, 
"QtyBathroomsMax" : 4.0, 
"SiteOrigin" : NumberInt(3), 
"Type" : NumberInt(1), 
"Subtype" : NumberInt(7), 
"UpdateDate" : ISODate("2018-10-24T00:00:51.553+0000"), 
"SortOrder" : NumberInt(280), 
"IdDistrict" : NumberInt(1876), 
"DistrictName" : "Pituba", 
"IdCity" : NumberInt(988), 
"CityName" : "Salvador", 
"IdState" : NumberInt(5), 
"StateName" : "Bahia", 
"UF" : "BA", 
"FullAddress" : "Rua Ceará", 
"ZipCode" : NumberInt(41830450), 
"Latitude" : null, 
"Longitude" : null, 
"IdTransaction" : NumberInt(1), 
"ExpireAt" : ISODate("2018-11-12T23:00:51.553+0000"), 
"Facets" : [
    "Academia", 
    "Ar Condicionado", 
    "Área de Serviço", 
    "Cozinha", 
    "Espaço Verde / Parque", 
    "Piscina", 
    "Quadra Poliesportiva", 
    "Salão de jogos", 
    "Garagem"
]
}

Код в конвейере c # var= this.Collection.Aggregate (new AggregateOptions {AllowDiskUse = true}) .Match (фильтр) .Unwind (x => x.Facets) .SortByCount ("$ Facets");List listFacets = new List ();var output = pipe.ToList ();

Тот же запрос в MongoDB:

aggregate([
  {
    "$match": {
      "Subtype": {
        "$in": [
          7
        ]
      },
      "IdTransaction": 1,
      "IdDistrict": {
           "$in": [
             25938
           ]
         },
       "IdCity": 7994
    }
  },
  {
    "$unwind": "$Facets"
  },
  {
    "$sortByCount": "$Facets"
  }
])

Этот запрос занял 1070 мс.У меня есть несколько примеров с 10774 мс, и оба использовали IXScan: (

В моей коллекции 9 миллионов документов.

Вот мой журнал из профилировщика из 1 запроса. Запрос использовал IXSCAN, но я прочитал в 1статья (https://lamada.eu/blog/2016/11/08/troubleshooting-mongodb-queries-performance/), что для идеального IXScan нам нужно достичь keysExamined = nReturned = docsExamined.

Глядя на мои результаты, я не получил оптимальный индекс

Как можноЯ улучшаю этот запрос?

{
"op": "command",
    "ns": "SonarImovel.Property",
 "command": {
   "aggregate": "Property",
   "pipeline": [
     {
       "$match": {
         "Subtype": {
           "$in": [
             13
           ]
         },
         "IdTransaction": 1,
         "IdDistrict": {
           "$in": [
             25938
           ]
         },
         "IdCity": 7994
       }
     },
     {
       "$unwind": "$Facets"
     },
     {
       "$sortByCount": "$Facets"
     }
   ],
   "cursor": {

   },
   "$db": "SonarImovel",
   "lsid": {
     "id": UUID("6698f309-4f40-4b77-92bb-fc2a8a99efba")
   }
 },
 "keysExamined": 2638,
 "docsExamined": 2638,
 "hasSortStage": true,
 "cursorExhausted": true,
 "numYield": 71,
 "locks": {
   "Global": {
     "acquireCount": {
       "r": NumberLong(146)
     }
   },
   "Database": {
     "acquireCount": {
       "r": NumberLong(73)
     }
   },
   "Collection": {
     "acquireCount": {
       "r": NumberLong(73)
     }
   }
 },
 "nreturned": 39,
 "responseLength": 1707,
 "protocol": "op_msg",
 "millis": 1070,
 "planSummary": "IXSCAN { Subtype: 1, IdCity: 1, IdTransaction: 1, 
  IdDistrict: 1, SortOrder: 1 }"

1 Ответ

0 голосов
/ 28 декабря 2018

Я предпочитаю создать индекс в том же порядке, что и запрос u Подтип, idtransaction, iddistrict, idcity, sortorder

db.SonarImovel.Property.createIndex ({Подтип: 1, IdTransaction: 1, IdDistrict: 1,IdCity: 1, SortOrder: 1})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...