diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index df0fd9f..7878873 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -104,9 +104,11 @@ class ChangeList(object):
 
         # Get the total number of objects, with no admin filters applied.
         # Perform a slight optimization: Check to see whether any filters were
-        # given. If not, use paginator.hits to calculate the number of objects,
-        # because we've already done paginator.hits and the value is cached.
-        if not self.query_set.query.where:
+        # given by the user, if any came from ModelAdmin.queryset() we don't
+        #consider them here. If not, use paginator.hits to calculate the number
+        # of objects, because we've already done paginator.hits and the value
+        # is cached.
+        if not set(self.params) - set([ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR]):
             full_result_count = result_count
         else:
             full_result_count = self.root_query_set.count()
@@ -191,7 +193,7 @@ class ChangeList(object):
         # Naked except! Because we don't have any other way of validating "params".
         # They might be invalid if the keyword arguments are incorrect, or if the
         # values are not in the correct type, so we might get FieldError, ValueError,
-        # ValicationError, or ? from a custom field that raises yet something else 
+        # ValicationError, or ? from a custom field that raises yet something else
         # when handed impossible data.
         except:
             raise IncorrectLookupParameters
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index 0c7fbc0..8ceeb4d 100644
--- a/tests/regressiontests/admin_views/tests.py
+++ b/tests/regressiontests/admin_views/tests.py
@@ -2,14 +2,17 @@
 
 import re
 import datetime
-from django.core.files import temp as tempfile
-from django.test import TestCase
-from django.contrib.auth.models import User, Permission
-from django.contrib.contenttypes.models import ContentType
+
+from django.conf import settings
+from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
 from django.contrib.admin.models import LogEntry, DELETION
 from django.contrib.admin.sites import LOGIN_FORM_KEY
 from django.contrib.admin.util import quote
-from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
+from django.contrib.auth.models import User, Permission
+from django.contrib.contenttypes.models import ContentType
+from django.core.files import temp as tempfile
+from django.db import connection
+from django.test import TestCase
 from django.utils import formats
 from django.utils.cache import get_max_age
 from django.utils.html import escape
@@ -1289,6 +1292,15 @@ class AdminCustomQuerysetTest(TestCase):
             else:
                 self.assertNotContains(response, 'Primary key = %s' % i)
 
+    def test_changelist_view_count_queries(self):
+        old_debug = settings.DEBUG
+        settings.DEBUG = True
+        num_queries = len(connection.queries)
+        response = self.client.get('/test_admin/admin/admin_views/emptymodel/')
+        # The page should do 5 queries: 1 for the session, 1 for the user, 1
+        # for the count, 1 for user messages, and 1 for the objects on the page
+        self.assertEqual(len(connection.queries), num_queries+5, len(connection.queries) - num_queries)
+
     def test_change_view(self):
         for i in self.pks:
             response = self.client.get('/test_admin/admin/admin_views/emptymodel/%s/' % i)
