diff --git a/django/contrib/gis/db/backends/spatialite/creation.py b/django/contrib/gis/db/backends/spatialite/creation.py
index 33b6f95..5c97113 100644
--- a/django/contrib/gis/db/backends/spatialite/creation.py
+++ b/django/contrib/gis/db/backends/spatialite/creation.py
@@ -31,9 +31,6 @@ class SpatiaLiteCreation(DatabaseCreation):
         self.connection.close()
         self.connection.settings_dict["NAME"] = test_database_name
 
-        # Confirm the feature set of the test database
-        self.connection.features.confirm()
-
         # Need to load the SpatiaLite initialization SQL before running `syncdb`.
         self.load_spatialite_sql()
 
diff --git a/django/db/backends/__init__.py b/django/db/backends/__init__.py
index 7674f5c..57a550b 100644
--- a/django/db/backends/__init__.py
+++ b/django/db/backends/__init__.py
@@ -399,54 +399,49 @@ class BaseDatabaseFeatures(object):
     # in the SQL standard.
     supports_tablespaces = False
 
-    # Features that need to be confirmed at runtime
-    # Cache whether the confirmation has been performed.
-    _confirmed = False
-    supports_transactions = None
-    supports_stddev = None
-    can_introspect_foreign_keys = None
+    # Confirm support for introspected foreign keys
+    # Every database can do this reliably, except MySQL,
+    # which can't do it for MyISAM tables
+    can_introspect_foreign_keys = True
 
     # Support for the DISTINCT ON clause
     can_distinct_on_fields = False
 
     def __init__(self, connection):
         self.connection = connection
+        # Cached properties
+        self._supports_transactions = None
+        self._supports_stddev = None
 
-    def confirm(self):
-        "Perform manual checks of any database features that might vary between installs"
-        self._confirmed = True
-        self.supports_transactions = self._supports_transactions()
-        self.supports_stddev = self._supports_stddev()
-        self.can_introspect_foreign_keys = self._can_introspect_foreign_keys()
-
-    def _supports_transactions(self):
+    @property
+    def supports_transactions(self):
         "Confirm support for transactions"
-        cursor = self.connection.cursor()
-        cursor.execute('CREATE TABLE ROLLBACK_TEST (X INT)')
-        self.connection._commit()
-        cursor.execute('INSERT INTO ROLLBACK_TEST (X) VALUES (8)')
-        self.connection._rollback()
-        cursor.execute('SELECT COUNT(X) FROM ROLLBACK_TEST')
-        count, = cursor.fetchone()
-        cursor.execute('DROP TABLE ROLLBACK_TEST')
-        self.connection._commit()
-        return count == 0
-
-    def _supports_stddev(self):
+        if self._supports_transactions is None:
+            cursor = self.connection.cursor()
+            cursor.execute('CREATE TABLE ROLLBACK_TEST (X INT)')
+            self.connection._commit()
+            cursor.execute('INSERT INTO ROLLBACK_TEST (X) VALUES (8)')
+            self.connection._rollback()
+            cursor.execute('SELECT COUNT(X) FROM ROLLBACK_TEST')
+            count, = cursor.fetchone()
+            cursor.execute('DROP TABLE ROLLBACK_TEST')
+            self.connection._commit()
+            self._supports_transactions = (count == 0)
+        return self._supports_transactions
+
+    @property
+    def supports_stddev(self):
         "Confirm support for STDDEV and related stats functions"
-        class StdDevPop(object):
-            sql_function = 'STDDEV_POP'
-
-        try:
-            self.connection.ops.check_aggregate_support(StdDevPop())
-        except NotImplementedError:
-            self.supports_stddev = False
-
-    def _can_introspect_foreign_keys(self):
-        "Confirm support for introspected foreign keys"
-        # Every database can do this reliably, except MySQL,
-        # which can't do it for MyISAM tables
-        return True
+        if self._supports_stddev is None:
+            class StdDevPop(object):
+                sql_function = 'STDDEV_POP'
+
+            try:
+                self.connection.ops.check_aggregate_support(StdDevPop())
+                self._supports_stddev = True
+            except NotImplementedError:
+                self._supports_stddev = False
+        return self._supports_stddev
 
 
 class BaseDatabaseOperations(object):
diff --git a/django/db/backends/creation.py b/django/db/backends/creation.py
index 2db0acc..a5ed311 100644
--- a/django/db/backends/creation.py
+++ b/django/db/backends/creation.py
@@ -258,9 +258,6 @@ class BaseDatabaseCreation(object):
         self.connection.close()
         self.connection.settings_dict["NAME"] = test_database_name
 
-        # Confirm the feature set of the test database
-        self.connection.features.confirm()
-
         # Report syncdb messages at one level lower than that requested.
         # This ensures we don't get flooded with messages during testing
         # (unless you really ask to be flooded)
diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py
index 830808b..ed5f68a 100644
--- a/django/db/backends/mysql/base.py
+++ b/django/db/backends/mysql/base.py
@@ -153,6 +153,7 @@ class DatabaseFeatures(BaseDatabaseFeatures):
     def __init__(self, connection):
         super(DatabaseFeatures, self).__init__(connection)
         self._storage_engine = None
+        self._can_introspect_foreign_keys = None
 
     def _mysql_storage_engine(self):
         "Internal method used in Django tests. Don't rely on this from your code"
@@ -169,9 +170,13 @@ class DatabaseFeatures(BaseDatabaseFeatures):
             self._storage_engine = result[1]
         return self._storage_engine
 
-    def _can_introspect_foreign_keys(self):
+    @property
+    def can_introspect_foreign_keys(self):
         "Confirm support for introspected foreign keys"
-        return self._mysql_storage_engine() != 'MyISAM'
+        if self._can_introspect_foreign_keys is None:
+            self._can_introspect_foreign_keys = (
+                self._mysql_storage_engine() != 'MyISAM')
+        return self._can_introspect_foreign_keys
 
 class DatabaseOperations(BaseDatabaseOperations):
     compiler_module = "django.db.backends.mysql.compiler"
