diff --git a/utf8mb4_convert.drush.inc b/utf8mb4_convert.drush.inc
index 2a52ab1..ff92eba 100644
--- a/utf8mb4_convert.drush.inc
+++ b/utf8mb4_convert.drush.inc
@@ -23,6 +23,12 @@ class DrupalCharsetConverter {
    */
   protected $collation = 'utf8mb4_general_ci';
 
+  /**
+   * Whether to use the COMPRESSED row format.
+   * @var bool
+   */
+  protected $compressed = FALSE;
+
   /**
    * The current database connection for all actions.
    *
@@ -30,13 +36,16 @@ class DrupalCharsetConverter {
    */
   protected $connection;
 
-  public function __construct($charset = NULL, $collation = NULL) {
+  public function __construct($charset = NULL, $collation = NULL, $compressed = NULL) {
     if ($charset) {
       $this->charset = $charset;
     }
     if ($collation) {
       $this->collation = $collation;
     }
+    if ($compressed) {
+      $this->compressed = TRUE;
+    }
   }
 
   /**
@@ -154,6 +163,10 @@ class DrupalCharsetConverter {
       $table_names = array_diff($table_names, explode(',', $exclude_tables));
     }
 
+    if ($include_tables = drush_get_option('include-tables', '')) {
+      $table_names = array_merge($table_names, explode(',', $include_tables));
+    }
+
     sort($table_names);
     foreach ($table_names as $table_name) {
       if (!$this->connection->schema()->tableExists($table_name)) {
@@ -178,21 +191,29 @@ class DrupalCharsetConverter {
    */
   public function convertTable($table_name, $charset = NULL, $collation = NULL) {
     $collation = $collation ? $collation : $this->collation;
+    $isChanged = FALSE;
 
     $currentTable = $this->connection->query("SHOW TABLE STATUS where name = '" . $table_name . "'")->fetchAssoc();
     if ($currentTable['Collation'] == $collation) {
       drush_log("Skipping $table_name which is already at $collation", 'ok');
-      return;
     }
-    $this->query("ALTER TABLE {" . $table_name . "} ROW_FORMAT=DYNAMIC ENGINE=INNODB");
-    $sql = "ALTER TABLE {" . $table_name . "} CHARACTER SET = :charset COLLATE = :collation";
-    drush_print('Converting table: ' . $table_name);
-    $result = $this->query($sql, array(
-      ':charset' => $charset ? $charset : $this->charset,
-      ':collation' => $collation ? $collation : $this->collation,
-    ));
-    $this->convertTableFields($table_name, $charset, $collation);
-    $this->query("OPTIMIZE TABLE {" . $table_name . "}");
+    else {
+      $isChanged = TRUE;
+      $row_format = $this->compressed ? 'COMPRESSED' : 'DYNAMIC';
+      $this->query("ALTER TABLE {" . $table_name . "} ROW_FORMAT=" . $row_format . " ENGINE=INNODB");
+      $sql = "ALTER TABLE {" . $table_name . "} CHARACTER SET = :charset COLLATE = :collation";
+      drush_print('Converting table: ' . $table_name . ' row format: ' . $row_format);
+      $result = $this->query($sql, array(
+        ':charset' => $charset ? $charset : $this->charset,
+        ':collation' => $collation ? $collation : $this->collation,
+      ));
+    }
+
+    $isFieldChanged = $this->convertTableFields($table_name, $charset, $collation);
+    if ($isChanged || $isFieldChanged) {
+      $this->query("OPTIMIZE TABLE {" . $table_name . "}");
+      drush_print('Optimizing updated table: ' . $table_name);
+    }
     return $result;
   }
 
@@ -207,30 +228,34 @@ class DrupalCharsetConverter {
    *   (Optional) The collation.
    *
    * @return bool
-   *   success|failure.
+   *   changed|unchanged.
    */
   public function convertTableFields($table_name, $charset = NULL, $collation = NULL) {
+    $isChanged = FALSE;
     $results = $this->connection->query("SHOW FULL FIELDS FROM {" . $table_name . "}")->fetchAllAssoc('Field');
     $charset = $charset ? $charset : $this->charset;
     $collation = $collation ? $collation : $this->collation;
     foreach ($results as $row) {
-      // Skip fields that don't have collation, as they are probably int or similar.
-      // or if we are using that collation for this field already save a query
-      // or is not binary.
-      if (!$row->Collation || $row->Collation === $collation) {
+      // Skip fields that don't have collation, as they are probably int or similar,
+      // plus fields that have non-utf8 collation.
+      if (!$row->Collation || strpos($row->Collation, 'utf8') !== 0) {
         continue;
       }
-      // Skip fields that have non-utf8 collation.
-      if (strpos($row->Collation, 'utf8') !== 0) {
-        continue;
-      }
-      drush_print('Converting field: ' . $table_name . '.' . $row->Field);
 
       // Detect the BINARY option from hook_schema.
+      $row_collation = $collation;
       if (strpos($row->Collation, '_bin') !== FALSE) {
-        $collation = 'utf8mb4_bin';
+        $row_collation = 'utf8mb4_bin';
+      }
+
+      // Skip if we are using the target collation for this field already.
+      if ($row->Collation === $row_collation) {
+        continue;
       }
 
+      drush_print('Converting field: ' . $table_name . '.' . $row->Field . ' (collation: ' . $row_collation . ')');
+      $isChanged = TRUE;
+
       $default = '';
       if ($row->Default !== NULL) {
         $default = 'DEFAULT ' . ($row->Default == "CURRENT_TIMESTAMP" ? "CURRENT_TIMESTAMP" : ":default");
@@ -253,7 +278,7 @@ class DrupalCharsetConverter {
 
       $params = array(
         ':charset' => $charset,
-        ':collation' => $collation,
+        ':collation' => $row_collation,
         ':comment' => $row->Comment,
       );
       if (strstr($default, ':default')) {
@@ -261,6 +286,8 @@ class DrupalCharsetConverter {
       }
       $this->query($sql, $params);
     }
+
+    return $isChanged;
   }
 }
 
@@ -276,13 +303,18 @@ function utf8mb4_convert_drush_command() {
     'options' => array(
       'collation' => 'Specify a collation. Default is "utf8mb4_general_ci", sites with content that is outside of Latin 1 characters may want to use "utf8mb4_unicode_ci".',
       'charset' => 'Specify a charset. Default is "utf8mb4".',
-      'exclude-tables' => 'Specify tables to exclude, comma separated.'
+      'exclude-tables' => 'Specify tables to exclude, comma separated.',
+      'include-tables' => 'Specify tables to include, comma separated (used to convert tables not defined with hook_schema() by an enabled module).',
+      # TODO extract this from the database settings instead when https://www.drupal.org/project/drupal/issues/2857359 is fixed and backported to D7
+      'compressed' => 'Use the row format COMPRESSED instead of DYNAMIC (the default)',
     ),
     'examples' => array(
       'drush utf8mb4-convert-databases' => 'Convert the default database.',
       'drush utf8mb4-convert-databases default' => 'Convert the default database (same as no argument).',
+      'drush utf8mb4-convert-databases default --compressed' => 'Convert the default database, but use the row format COMPRESSED.',
       'drush utf8mb4-convert-databases default site2 site3' => 'Convert all specified databases.',
-      'drush utf8mb4-convert-databases --exclude-tables=users,sessions' => 'Convert the default database, skipping the users and sessions tables.'
+      'drush utf8mb4-convert-databases --exclude-tables=users,sessions' => 'Convert the default database, skipping the users and sessions tables.',
+      'drush utf8mb4-convert-databases --include-tables=cache_update' => 'Convert the default database, including the cache_update table, even if the update module is not enabled.',
     ),
   );
 
@@ -297,6 +329,8 @@ function utf8mb4_convert_drush_command() {
 function drush_utf8mb4_convert_databases($connections_input = NULL) {
   $charset = drush_get_option('charset', 'utf8mb4');
   $collation = drush_get_option('collation', 'utf8mb4_general_ci');
+  $compressed = drush_get_option('compressed', FALSE);
+
   global $databases;
   if (version_compare(VERSION, '7.50', '<')) {
     drush_print('Please install Drupal 7.50 or above prior to running this script.');
@@ -323,7 +357,7 @@ function drush_utf8mb4_convert_databases($connections_input = NULL) {
     return;
   }
 
-  $converter = new DrupalCharsetConverter($charset, $collation);
+  $converter = new DrupalCharsetConverter($charset, $collation, $compressed);
   $success = $converter->convert($connections);
   // Prevent the hook_requirements() check from telling us to convert the
   // database to utf8mb4.
