How to add a database index to a base field
Currently the only way to do that is to create your own storage_schema entity handler.

See Node as an example, the annotation:

*     "storage_schema" = "Drupal\node\NodeStorageSchema",


There you can alter both the schema for a while table, or you can do it for a specific field. NodeStorageSchema does both:

  /**
   * {@inheritdoc}
   */
  protected function getEntitySchema(ContentEntityTypeInterface $entity_type, $reset = FALSE) {
    $schema = parent::getEntitySchema($entity_type, $reset);

    $schema['node_field_data']['indexes'] += array(
      'node__frontpage' =&gt; array('promote', 'status', 'sticky', 'created'),
      'node__status_type' =&gt; array('status', 'type', 'nid'),
      'node__title_type' =&gt; array('title', array('type', 4)),
    );

    return $schema;
  }


And below in getSharedTableFieldSchema():

if ($table_name == 'node_revision') {
  switch ($field_name) {
    case 'langcode':
      $this-&gt;addSharedTableFieldIndex($storage_definition, $schema, TRUE);
      break;

    case 'revision_uid':
      $this-&gt;addSharedTableFieldForeignKey($storage_definition, $schema, 'users', 'uid');
      break;
  }
}