Skip to content

Commit c91cab3

Browse files
committed
mhnsw: don't create many empty layers
1 parent 0589765 commit c91cab3

File tree

1 file changed

+18
-20
lines changed

1 file changed

+18
-20
lines changed

sql/vector_mhnsw.cc

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -546,8 +546,6 @@ int mhnsw_insert(TABLE *table, KEY *keyinfo)
546546
return write_neighbors(&ctx, 0, target);
547547
}
548548

549-
longlong max_layer= graph->field[0]->val_int();
550-
551549
List<FVectorNode> candidates;
552550
List<FVectorNode> start_nodes;
553551
String ref_str, *ref_ptr;
@@ -572,36 +570,37 @@ int mhnsw_insert(TABLE *table, KEY *keyinfo)
572570
double new_num= my_rnd(&thd->rand);
573571
double log= -std::log(new_num) * NORMALIZATION_FACTOR;
574572
longlong new_node_layer= static_cast<longlong>(std::floor(log));
573+
longlong max_layer= graph->field[0]->val_int();
575574

576-
// XXX what is that?
577-
for (longlong cur_layer= new_node_layer; cur_layer >= max_layer + 1;
578-
cur_layer--)
575+
if (new_node_layer > max_layer)
579576
{
580-
if (int err= write_neighbors(&ctx, cur_layer, target))
577+
if (int err= write_neighbors(&ctx, max_layer + 1, target))
581578
return err;
579+
new_node_layer= max_layer;
582580
}
583-
584-
for (longlong cur_layer= max_layer; cur_layer > new_node_layer; cur_layer--)
581+
else
585582
{
586-
if (int err= search_layer(&ctx, start_nodes,
587-
thd->variables.hnsw_ef_constructor, cur_layer,
588-
&candidates))
589-
return err;
590-
start_nodes.empty();
591-
start_nodes.push_back(candidates.head(), &ctx.root); // XXX ef=1
592-
candidates.empty();
583+
for (longlong cur_layer= max_layer; cur_layer > new_node_layer; cur_layer--)
584+
{
585+
if (int err= search_layer(&ctx, start_nodes,
586+
thd->variables.hnsw_ef_constructor, cur_layer,
587+
&candidates))
588+
return err;
589+
start_nodes.empty();
590+
start_nodes.push_back(candidates.head(), &ctx.root); // XXX ef=1
591+
candidates.empty();
592+
}
593593
}
594594

595-
for (longlong cur_layer= std::min(max_layer, new_node_layer);
596-
cur_layer >= 0; cur_layer--)
595+
for (longlong cur_layer= new_node_layer; cur_layer >= 0; cur_layer--)
597596
{
598597
if (int err= search_layer(&ctx, start_nodes,
599598
thd->variables.hnsw_ef_constructor, cur_layer,
600599
&candidates))
601600
return err;
602601

603-
uint max_neighbors= (cur_layer == 0) ? // heuristics from the paper
604-
thd->variables.hnsw_max_connection_per_layer * 2
602+
uint max_neighbors= (cur_layer == 0) // heuristics from the paper
603+
? thd->variables.hnsw_max_connection_per_layer * 2
605604
: thd->variables.hnsw_max_connection_per_layer;
606605

607606
if (int err= select_neighbors(&ctx, cur_layer, target, candidates,
@@ -611,7 +610,6 @@ int mhnsw_insert(TABLE *table, KEY *keyinfo)
611610
return err;
612611
start_nodes= candidates;
613612
}
614-
start_nodes.empty();
615613

616614
dbug_tmp_restore_column_map(&table->read_set, old_map);
617615

0 commit comments

Comments
 (0)