Index: modules/field/modules/field_sql_storage/field_sql_storage.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/field/modules/field_sql_storage/field_sql_storage.module,v
retrieving revision 1.19
diff -u -r1.19 field_sql_storage.module
--- modules/field/modules/field_sql_storage/field_sql_storage.module	22 Aug 2009 00:58:53 -0000	1.19
+++ modules/field/modules/field_sql_storage/field_sql_storage.module	31 Aug 2009 21:13:47 -0000
@@ -138,12 +138,6 @@
         'not null' => FALSE,
         'description' => 'The entity revision id this data is attached to, or NULL if the entity type is not versioned',
       ),
-      'delta' => array(
-        'type' => 'int',
-        'unsigned' => TRUE,
-        'not null' => TRUE,
-        'description' => 'The sequence number for this data item, used for multi-value fields',
-      ),
       // @todo Consider storing language as integer.
       'language' => array(
         'type' => 'varchar',
@@ -152,9 +146,23 @@
         'default' => '',
         'description' => 'The language for this data item.',
       ),
+      'delta' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'The sequence number for this data item, used for multi-value fields',
+      ),
     ),
+    // @todo Is the primary key needed at all ?
     'primary key' => array('etid', 'entity_id', 'deleted', 'delta', 'language'),
-    // TODO : index on 'bundle'
+    'indexes' => array(
+      'etid' => array('etid'),
+      'bundle' => array('bundle'),
+      'deleted' => array('deleted'),
+      'entity_id' => array('entity_id'),
+      'revision_id' => array('revision_id'),
+      'language' => array('language'),
+    ),
   );
 
   // Add field columns.
@@ -461,6 +469,21 @@
     if (in_array($column, $field_columns)) {
       $column = _field_sql_storage_columnname($field_name, $column);
     }
+    // Translate entity types into numeric ids. Expressing the condition on the
+    // local 'etid' column rather than the JOINed 'type' column avoids a
+    // filesort.
+    if ($column == 'type') {
+      $column = 't.etid';
+      if (is_array($value)) {
+        foreach (array_keys($value) as $key) {
+          $value[$key] = _field_sql_storage_etid($value[$key]);
+        }
+      }
+      else {
+        $value = _field_sql_storage_etid($value);
+      }
+    }
+
     $query->condition($column, $value, $operator);
 
     if ($column == 'deleted') {
