diff --git src/bp-activity/bp-activity-functions.php src/bp-activity/bp-activity-functions.php
index e8487a78f..3b7187b67 100644
--- src/bp-activity/bp-activity-functions.php
+++ src/bp-activity/bp-activity-functions.php
@@ -1783,18 +1783,17 @@ function bp_activity_get( $args = '' ) {
 			'per_page'          => false,        // results per page.
 			'sort'              => 'DESC',       // sort ASC or DESC.
 			'display_comments'  => false,        // False for no comments. 'stream' for within stream display, 'threaded' for below each activity item.
-
 			'search_terms'      => false,        // Pass search terms as a string.
 			'meta_query'        => false,        // Filter by activity meta. See WP_Meta_Query for format.
 			'date_query'        => false,        // Filter by date. See first parameter of WP_Date_Query for format.
 			'filter_query'      => false,
 			'show_hidden'       => false,        // Show activity items that are hidden site-wide?
 			'exclude'           => false,        // Comma-separated list of activity IDs to exclude.
-			'in'                => false,        // Comma-separated list or array of activity IDs to which you.
-												// want to limit the query.
+			'in'                => false,        // Comma-separated list or array of activity IDs to which you want to limit the query.
 			'spam'              => 'ham_only',   // 'ham_only' (default), 'spam_only' or 'all'.
 			'update_meta_cache' => true,
 			'count_total'       => false,
+			'count_total_only'  => false,
 			'scope'             => false,
 
 			/**
@@ -1812,26 +1811,29 @@ function bp_activity_get( $args = '' ) {
 		'activity_get'
 	);
 
-	$activity = BP_Activity_Activity::get( array(
-		'page'              => $r['page'],
-		'per_page'          => $r['per_page'],
-		'max'               => $r['max'],
-		'sort'              => $r['sort'],
-		'search_terms'      => $r['search_terms'],
-		'meta_query'        => $r['meta_query'],
-		'date_query'        => $r['date_query'],
-		'filter_query'      => $r['filter_query'],
-		'filter'            => $r['filter'],
-		'scope'             => $r['scope'],
-		'display_comments'  => $r['display_comments'],
-		'show_hidden'       => $r['show_hidden'],
-		'exclude'           => $r['exclude'],
-		'in'                => $r['in'],
-		'spam'              => $r['spam'],
-		'update_meta_cache' => $r['update_meta_cache'],
-		'count_total'       => $r['count_total'],
-		'fields'            => $r['fields'],
-	) );
+	$activity = BP_Activity_Activity::get(
+		array(
+			'page'              => $r['page'],
+			'per_page'          => $r['per_page'],
+			'max'               => $r['max'],
+			'sort'              => $r['sort'],
+			'search_terms'      => $r['search_terms'],
+			'meta_query'        => $r['meta_query'],
+			'date_query'        => $r['date_query'],
+			'filter_query'      => $r['filter_query'],
+			'filter'            => $r['filter'],
+			'scope'             => $r['scope'],
+			'display_comments'  => $r['display_comments'],
+			'show_hidden'       => $r['show_hidden'],
+			'exclude'           => $r['exclude'],
+			'in'                => $r['in'],
+			'spam'              => $r['spam'],
+			'update_meta_cache' => $r['update_meta_cache'],
+			'count_total'       => $r['count_total'],
+			'count_total_only'  => $r['count_total_only'],
+			'fields'            => $r['fields'],
+		)
+	);
 
 	/**
 	 * Filters the requested activity item(s).
diff --git src/bp-activity/classes/class-bp-activity-activity.php src/bp-activity/classes/class-bp-activity-activity.php
index cf084c16f..ebd28e5d7 100644
--- src/bp-activity/classes/class-bp-activity-activity.php
+++ src/bp-activity/classes/class-bp-activity-activity.php
@@ -341,6 +341,7 @@ class BP_Activity_Activity {
 	 * @since 1.2.0
 	 * @since 2.4.0 Introduced the `$fields` parameter.
 	 * @since 2.9.0 Introduced the `$order_by` parameter.
+	 * @since 10.0.0 Introduced the `$count_total_only` parameter.
 	 *
 	 * @see BP_Activity_Activity::get_filter_sql() for a description of the
 	 *      'filter' parameter.
@@ -372,6 +373,8 @@ class BP_Activity_Activity {
 	 *     @type bool         $update_meta_cache Whether to pre-fetch metadata for queried activity items. Default: true.
 	 *     @type string|bool  $count_total       If true, an additional DB query is run to count the total activity items
 	 *                                           for the query. Default: false.
+	 *     @type bool         $count_total_only  If true, only the DB query to count the total activity items is run.
+	 *                                           Default: false.
 	 * }
 	 * @return array The array returned has two keys:
 	 *               - 'total' is the count of located activities
@@ -435,6 +438,7 @@ class BP_Activity_Activity {
 				'spam'              => 'ham_only',      // Spam status.
 				'update_meta_cache' => true,            // Whether or not to update meta cache.
 				'count_total'       => false,           // Whether or not to use count_total.
+				'count_total_only'  => false,           // Whether to only get the total count.
 			)
 		);
 
@@ -629,6 +633,10 @@ class BP_Activity_Activity {
 			'has_more_items' => null,
 		);
 
+		// Init the activity list.
+		$activities     = array();
+		$only_get_count = (bool) $r['count_total_only'];
+
 		/**
 		 * Filters if BuddyPress should use legacy query structure over current structure for version 2.0+.
 		 *
@@ -640,7 +648,7 @@ class BP_Activity_Activity {
 		 * @param BP_Activity_Activity $value Current method being called.
 		 * @param array                $r     Parsed arguments passed into method.
 		 */
-		if ( apply_filters( 'bp_use_legacy_activity_query', false, __METHOD__, $r ) ) {
+		if ( ! $only_get_count && apply_filters( 'bp_use_legacy_activity_query', false, __METHOD__, $r ) ) {
 
 			// Legacy queries joined against the user table.
 			$select_sql = "SELECT DISTINCT a.*, u.user_email, u.user_nicename, u.user_login, u.display_name";
@@ -692,7 +700,7 @@ class BP_Activity_Activity {
 				$activities[ $i ]->is_spam           = (int) $ac->is_spam;
 			}
 
-		} else {
+		} elseif ( ! $only_get_count ) {
 			// Query first for activity IDs.
 			$activity_ids_sql = "{$select_sql} {$from_sql} {$join_sql} {$where_sql} ORDER BY {$order_by} {$sort}, a.id {$sort}";
 
@@ -745,7 +753,7 @@ class BP_Activity_Activity {
 			}
 		}
 
-		if ( 'ids' !== $r['fields'] ) {
+		if ( $activities && 'ids' !== $r['fields'] ) {
 			// Get the fullnames of users so we don't have to query in the loop.
 			$activities = self::append_user_fullnames( $activities );
 
@@ -772,9 +780,8 @@ class BP_Activity_Activity {
 
 		$retval['activities'] = $activities;
 
-		// If $max is set, only return up to the max results.
-		if ( ! empty( $r['count_total'] ) ) {
-
+		// Only query the count total if requested.
+		if ( ! empty( $r['count_total'] ) || $only_get_count ) {
 			/**
 			 * Filters the total activities MySQL statement.
 			 *
@@ -785,6 +792,17 @@ class BP_Activity_Activity {
 			 * @param string $sort      Sort direction for query.
 			 */
 			$total_activities_sql = apply_filters( 'bp_activity_total_activities_sql', "SELECT count(DISTINCT a.id) FROM {$bp->activity->table_name} a {$join_sql} {$where_sql}", $where_sql, $sort );
+
+			/*
+			 * Queries that include 'last_activity' are cached separately,
+			 * since they are generally much less long-lived.
+			 */
+			if ( preg_match( '/a\.type NOT IN \([^\)]*\'last_activity\'[^\)]*\)/', $total_activities_sql ) ) {
+				$cache_group = 'bp_activity';
+			} else {
+				$cache_group = 'bp_activity_with_last_activity';
+			}
+
 			$cached = bp_core_get_incremented_cache( $total_activities_sql, $cache_group );
 			if ( false === $cached ) {
 				$total_activities = $wpdb->get_var( $total_activities_sql );
@@ -793,7 +811,8 @@ class BP_Activity_Activity {
 				$total_activities = $cached;
 			}
 
-			if ( !empty( $r['max'] ) ) {
+			// If $max is set, only return up to the max results.
+			if ( ! empty( $r['max'] ) ) {
 				if ( (int) $total_activities > (int) $r['max'] ) {
 					$total_activities = $r['max'];
 				}
diff --git src/bp-activity/classes/class-bp-activity-list-table.php src/bp-activity/classes/class-bp-activity-list-table.php
index e735f6445..9494f2144 100644
--- src/bp-activity/classes/class-bp-activity-list-table.php
+++ src/bp-activity/classes/class-bp-activity-list-table.php
@@ -156,7 +156,7 @@ class BP_Activity_List_Table extends WP_List_Table {
 			'display_comments' => 'stream',
 			'show_hidden'      => true,
 			'spam'             => 'spam_only',
-			'count_total'      => 'count_query',
+			'count_total_only' => true,
 		) );
 		$this->spam_count = $spams['total'];
 		unset( $spams );
@@ -214,9 +214,9 @@ class BP_Activity_List_Table extends WP_List_Table {
 		} elseif ( 'single' !== $this->view ) {
 			$count_activities = bp_activity_get(
 				array(
-					'fields'      => 'ids',
-					'show_hidden' => true,
-					'count_total' => 'count_query',
+					'fields'           => 'ids',
+					'show_hidden'      => true,
+					'count_total_only' => true,
 				)
 			);
 
diff --git tests/phpunit/testcases/activity/functions.php tests/phpunit/testcases/activity/functions.php
index 4e1700f02..50e584af5 100644
--- tests/phpunit/testcases/activity/functions.php
+++ tests/phpunit/testcases/activity/functions.php
@@ -1974,4 +1974,29 @@ Bar!';
 		$this->assertEqualSets( [ $a1 ], bp_activity_get_user_favorites( $u1 ) );
 		$this->assertSame( $latest_update, bp_get_user_meta( $u1, 'bp_latest_update', true ) );
 	}
+
+	/**
+	 * @ticket BP8591
+	 */
+	public function test_activity_admin_screen_count_activities() {
+		$u1 = self::factory()->user->create();
+		$a1 = self::factory()->activity->create_many(
+			5,
+			array(
+				'user_id'   => $u1,
+				'component' => 'activity',
+				'type'      => 'activity_update',
+			)
+		);
+		bp_update_user_last_activity( $u1, date( 'Y-m-d H:i:s', bp_core_current_time( true, 'timestamp' ) ) );
+
+		$count_activities = bp_activity_get(
+			array(
+				'show_hidden'      => true,
+				'count_total_only' => true,
+			)
+		);
+
+		$this->assertTrue( 5 === (int) $count_activities['total'] );
+	}
 }
