diff --git a/changes/use-index-for-sorting-hosts b/changes/use-index-for-sorting-hosts new file mode 100644 index 0000000000..8b5c8cf0dc --- /dev/null +++ b/changes/use-index-for-sorting-hosts @@ -0,0 +1 @@ +* Improve performance of sorting hosts in certain scenarios. diff --git a/server/datastore/mysql/hosts.go b/server/datastore/mysql/hosts.go index b293efdc0c..1f2077bc01 100644 --- a/server/datastore/mysql/hosts.go +++ b/server/datastore/mysql/hosts.go @@ -816,7 +816,7 @@ func (d *Datastore) SearchHosts(ctx context.Context, filter fleet.TeamFilter, qu args = append(args, in) sqlb.WriteString(" id NOT IN (?) AND ") sqlb.WriteString(d.whereFilterHostsByTeams(filter, "h")) - sqlb.WriteString(` ORDER BY COALESCE(hst.seen_time, h.created_at) DESC LIMIT 10`) + sqlb.WriteString(` ORDER BY h.id DESC LIMIT 10`) sql, args, err := sqlx.In(sqlb.String(), args...) if err != nil { diff --git a/server/datastore/mysql/hosts_test.go b/server/datastore/mysql/hosts_test.go index 16d1c1817f..bd439913e3 100644 --- a/server/datastore/mysql/hosts_test.go +++ b/server/datastore/mysql/hosts_test.go @@ -1017,6 +1017,13 @@ func testHostsSearch(t *testing.T, ds *Datastore) { assert.Nil(t, err) require.Len(t, hosts, 1) assert.Equal(t, hosts[0].ID, h2.ID) + + // sorted by ids desc + filter = fleet.TeamFilter{User: userObs, IncludeObserver: true} + hits, err = ds.SearchHosts(context.Background(), filter, "") + require.NoError(t, err) + assert.Len(t, hits, 3) + assert.Equal(t, []uint{h3.ID, h2.ID, h1.ID}, []uint{hits[0].ID, hits[1].ID, hits[2].ID}) } func testHostsSearchLimit(t *testing.T, ds *Datastore) {