diff --git a/commerce.install b/commerce.install
index 4e8e3960..0d2e65ee 100644
--- a/commerce.install
+++ b/commerce.install
@@ -5,6 +5,8 @@
  * Contains install and update functions for Commerce.
  */
 
+use Drupal\commerce\CommerceContentEntityStorageSchema;
+
 /**
  * Implements hook_requirements().
  */
@@ -21,3 +23,18 @@ function commerce_requirements($phase) {
 
   return $requirements;
 }
+
+
+/**
+ * Regenerates schema for entities implementing new indexes.
+ */
+function commerce_update_8001() {
+  $entity_type_manager = \Drupal::entityTypeManager();
+  $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
+  foreach ($entity_type_manager->getDefinitions() as $entity_type) {
+    $storage_schema_handler = $entity_type->getHandlerClass('storage_schema');
+    if ($storage_schema_handler == CommerceContentEntityStorageSchema::class) {
+      $definition_update_manager->updateEntityType($entity_type);
+    }
+  }
+}
diff --git a/modules/order/src/Entity/Order.php b/modules/order/src/Entity/Order.php
index df3d896c..b7805598 100644
--- a/modules/order/src/Entity/Order.php
+++ b/modules/order/src/Entity/Order.php
@@ -29,6 +29,7 @@ use Drupal\profile\Entity\ProfileInterface;
  *   handlers = {
  *     "event" = "Drupal\commerce_order\Event\OrderEvent",
  *     "storage" = "Drupal\commerce_order\OrderStorage",
+ *     "storage_schema" = "Drupal\commerce\CommerceContentEntityStorageSchema",
  *     "access" = "Drupal\commerce_order\OrderAccessControlHandler",
  *     "permission_provider" = "Drupal\commerce_order\OrderPermissionProvider",
  *     "list_builder" = "Drupal\commerce_order\OrderListBuilder",
@@ -48,6 +49,10 @@ use Drupal\profile\Entity\ProfileInterface;
  *   base_table = "commerce_order",
  *   admin_permission = "administer commerce_order",
  *   permission_granularity = "bundle",
+ *   fieldable = TRUE,
+ *   field_indexes = {
+ *     "order_number" = {"order_number"}
+ *   },
  *   entity_keys = {
  *     "id" = "order_id",
  *     "label" = "order_number",
diff --git a/modules/payment/src/Entity/Payment.php b/modules/payment/src/Entity/Payment.php
index a87dcd1a..a1162ca3 100644
--- a/modules/payment/src/Entity/Payment.php
+++ b/modules/payment/src/Entity/Payment.php
@@ -28,6 +28,7 @@ use Drupal\Core\Field\BaseFieldDefinition;
  *     "access" = "Drupal\commerce_payment\PaymentAccessControlHandler",
  *     "list_builder" = "Drupal\commerce_payment\PaymentListBuilder",
  *     "storage" = "Drupal\commerce_payment\PaymentStorage",
+ *     "storage_schema" = "Drupal\commerce\CommerceContentEntityStorageSchema",
  *     "form" = {
  *       "operation" = "Drupal\commerce_payment\Form\PaymentOperationForm",
  *       "delete" = "Drupal\Core\Entity\ContentEntityDeleteForm",
@@ -39,6 +40,10 @@ use Drupal\Core\Field\BaseFieldDefinition;
  *   },
  *   base_table = "commerce_payment",
  *   admin_permission = "administer commerce_payment",
+ *   fieldable = TRUE,
+ *   field_indexes = {
+ *     "remote_id" = {"remote_id"}
+ *   },
  *   entity_keys = {
  *     "id" = "payment_id",
  *     "bundle" = "type",
diff --git a/modules/payment/src/Entity/PaymentMethod.php b/modules/payment/src/Entity/PaymentMethod.php
index 685fb14a..3ecdeb28 100644
--- a/modules/payment/src/Entity/PaymentMethod.php
+++ b/modules/payment/src/Entity/PaymentMethod.php
@@ -31,6 +31,7 @@ use Drupal\profile\Entity\ProfileInterface;
  *     "list_builder" = "Drupal\commerce_payment\PaymentMethodListBuilder",
  *     "storage" = "Drupal\commerce_payment\PaymentMethodStorage",
  *     "views_data" = "Drupal\commerce\CommerceEntityViewsData",
+ *     "storage_schema" = "Drupal\commerce\CommerceContentEntityStorageSchema",
  *     "form" = {
  *       "edit" = "Drupal\commerce_payment\Form\PaymentMethodEditForm",
  *       "delete" = "Drupal\commerce_payment\Form\PaymentMethodDeleteForm"
@@ -41,6 +42,10 @@ use Drupal\profile\Entity\ProfileInterface;
  *   },
  *   base_table = "commerce_payment_method",
  *   admin_permission = "administer commerce_payment_method",
+ *   fieldable = TRUE,
+ *   field_indexes = {
+ *     "remote_id" = {"remote_id"}
+ *   },
  *   entity_keys = {
  *     "id" = "method_id",
  *     "uuid" = "uuid",
diff --git a/modules/product/src/Entity/ProductVariation.php b/modules/product/src/Entity/ProductVariation.php
index 7c88d95f..8da01411 100644
--- a/modules/product/src/Entity/ProductVariation.php
+++ b/modules/product/src/Entity/ProductVariation.php
@@ -30,6 +30,7 @@ use Drupal\user\UserInterface;
  *   handlers = {
  *     "event" = "Drupal\commerce_product\Event\ProductVariationEvent",
  *     "storage" = "Drupal\commerce_product\ProductVariationStorage",
+ *     "storage_schema" = "Drupal\commerce\CommerceContentEntityStorageSchema",
  *     "access" = "Drupal\commerce_product\ProductVariationAccessControlHandler",
  *     "permission_provider" = "Drupal\commerce_product\ProductVariationPermissionProvider",
  *     "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
@@ -41,6 +42,10 @@ use Drupal\user\UserInterface;
  *     "translation" = "Drupal\content_translation\ContentTranslationHandler"
  *   },
  *   admin_permission = "administer commerce_product",
+ *   fieldable = TRUE,
+ *   field_indexes = {
+ *     "sku" = {"sku"}
+ *   },
  *   translatable = TRUE,
  *   content_translation_ui_skip = TRUE,
  *   base_table = "commerce_product_variation",
diff --git a/modules/promotion/src/Entity/Coupon.php b/modules/promotion/src/Entity/Coupon.php
index 640e21bd..18e2e59e 100644
--- a/modules/promotion/src/Entity/Coupon.php
+++ b/modules/promotion/src/Entity/Coupon.php
@@ -24,6 +24,7 @@ use Drupal\Core\Entity\EntityTypeInterface;
  *     "event" = "Drupal\commerce_promotion\Event\CouponEvent",
  *     "list_builder" = "Drupal\commerce_promotion\CouponListBuilder",
  *     "storage" = "Drupal\commerce_promotion\CouponStorage",
+ *     "storage_schema" = "Drupal\commerce\CommerceContentEntityStorageSchema",
  *     "access" = "Drupal\commerce_promotion\CouponAccessControlHandler",
  *     "views_data" = "Drupal\commerce\CommerceEntityViewsData",
  *     "form" = {
@@ -37,6 +38,9 @@ use Drupal\Core\Entity\EntityTypeInterface;
  *   },
  *   base_table = "commerce_promotion_coupon",
  *   admin_permission = "administer commerce_promotion",
+ *   field_indexes = {
+ *     "code" = {"code"}
+ *   },
  *   entity_keys = {
  *     "id" = "id",
  *     "label" = "code",
diff --git a/src/CommerceContentEntityStorageSchema.php b/src/CommerceContentEntityStorageSchema.php
new file mode 100644
index 00000000..ab14f424
--- /dev/null
+++ b/src/CommerceContentEntityStorageSchema.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Drupal\commerce;
+
+use Drupal\Core\Entity\ContentEntityTypeInterface;
+use Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema;
+
+class CommerceContentEntityStorageSchema extends SqlContentEntityStorageSchema {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEntitySchema(ContentEntityTypeInterface $entity_type, $reset = FALSE) {
+    $schema = parent::getEntitySchema($entity_type, $reset);
+
+    $field_indexes = $entity_type->get('field_indexes');
+    if (!empty($field_indexes)) {
+      $tables = $this->getEntitySchemaTables();
+      $schema_table = $tables['base_table'];
+      // If the entity is translatable, there will be a data table for fields.
+      // @see \Drupal\Core\Entity\Sql\SqlContentEntityStorage::initTableLayout
+      if (isset($tables['data_table'])) {
+        $schema_table = $tables['data_table'];
+      }
+
+      foreach ($field_indexes as $key => $value) {
+        $schema[$schema_table]['indexes'][$entity_type->id() . '_field__' . $key] = (array) $value;
+      }
+    }
+    return $schema;
+  }
+
+}
