sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Qué importancia tiene el orden de los índices compuestos en el rendimiento de MongoDB?

Redsandro,

Debe tener en cuenta la Index Cardinality y Selectivity .

1. Índice Cardinalidad

La cardinalidad del índice se refiere a cuántos valores posibles hay para un campo. El campo sex sólo tiene dos valores posibles. Tiene una cardinalidad muy baja . Otros campos como names, usernames, phone numbers, emails , etc. tendrá un valor más exclusivo para cada documento de la colección, que se considera alta cardinalidad .

  • Gran Cardinalidad

    Cuanto mayor sea la cardinalidad de un campo, más útil será un índice, porque los índices reducen el espacio de búsqueda, lo que lo convierte en un conjunto mucho más pequeño.

    Si tiene un índice sobre sex y usted está buscando hombres llamados John. Solo reduciría el espacio de resultados en aproximadamente un 50% si indexara por sex primero. Por el contrario, si indexaste por name , inmediatamente reduciría el conjunto de resultados a una fracción de minutos de usuarios llamados John, luego consultaría esos documentos para verificar el género.

  • Regla general

    Intente crear índices en high-cardinality teclas o poner high-cardinality llaves primero en el índice compuesto. Puede leer más sobre esto en la sección sobre índices compuestos en el libro:

    MongoDB La Guía Definitiva

2. Selectividad

Además, desea usar índices de forma selectiva y escribir consultas que limiten la cantidad de documentos posibles con el campo indexado. Para mantenerlo simple, considere la siguiente colección. Si su índice es {name:1} , si ejecuta la consulta { name: "John", sex: "male"} . Tendrás que escanear 1 documento. Porque permitiste que MongoDB fuera selectivo.

{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}

Considere la siguiente colección. Si su índice es {sex:1} , si ejecuta la consulta {sex: "male", name: "John"} . Tendrás que escanear 4 documentos.

{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}

Imagine las posibles diferencias en un conjunto de datos más grande.

Una pequeña explicación de los índices compuestos

Es fácil hacer una suposición incorrecta sobre los índices compuestos. De acuerdo con los documentos de MongoDB sobre índices compuestos.

MongoDB admite índices compuestos, donde una estructura de índice único contiene referencias a múltiples campos dentro de los documentos de una colección. El siguiente diagrama ilustra un ejemplo de un índice compuesto en dos campos:

Cuando crea un índice compuesto, 1 índice contendrá varios campos. Entonces, si indexamos una colección por {"sex" : 1, "name" : 1} , el índice se verá más o menos así:

["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103

Si indexamos una colección por {"name" : 1, "sex" : 1} , el índice se verá más o menos así:

["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103

Tener {name:1} ya que el Prefijo le servirá mucho mejor al usar índices compuestos. Hay mucho más que se puede leer sobre el tema, espero que esto pueda ofrecer algo de claridad.