把 MySQL 中的 MyISAM 表格转换成 InnoDB 的PHP小工具


我们都知道 MYSQL中常见表格的引擎有两种: 一是MyISAM 另一种是 InnoDB (当然还有Memory, CSV等其它系统自带的类型). MyISAM 是5.5.1版本前默认的数据库引擎类型, 而5.5.1版之后所有新创建的表格默认类型就是 InnoDB 了.

MyISAM 的优点是压缩比较大, 同时是整个表格锁定, 所以不太适合经常插入删除的表格. MyISAM 还不支持 Transaction, 在之前, MyISAM 的一大优点是支持 全文检索 Full Text Indexing 不过现在 InnoDB 也可以了.

InnoDB 支持事务, 是在行级别进行锁定, 而且在大部分情况下性能要好一些.

把表格转换成 InnoDB

我们可以通过 Alter Table 表名 Engine=InnoDB 来把单个表转换成 InnoDB 但是一个数据库有很多这样的表, 一个一个弄实在是麻烦, 所以, 整了一个PHP小工具, 在命令行下执行, 该PHP脚本可以把指定数据库中的 MyISAM 的表都转换成 InnoDB.

系统中数据库如 sys, mysql 有些表类型最好不要去修改.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
// https://helloacm.com/a-simple-php-command-line-tool-to-convert-mysql-tables-from-myisam-to-innodb-in-specified-database/
function ConvertAllTablesToInnoDB($database) {
  define("DB_HOST", "localhost");
  define("DB_USER", "root");
  define("DB_PASSWORD", "password");  
  $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, $database);
  if (!$conn) {
      echo "Error: Unable to connect to MySQL." . PHP_EOL;
      echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
      echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
      exit;        
  }      
  $sql = "SELECT TABLE_NAME FROM 
      INFORMATION_SCHEMA.TABLES
      WHERE TABLE_SCHEMA = '$database' 
      AND ENGINE = 'MyISAM'
  ";
  
  $rs = mysqli_query($conn, $sql);
  
  while ($row = mysqli_fetch_array($rs)) {
      $tbl = $row[0];
      $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
      echo $sql . "\n";
      mysqli_query($conn, $sql);
  }
}
    
if ($argc < 2) {
      exit( "Usage: php $argv[0] database1 database2 ...\n" );
}
 
for ($i = 1; $i < $argc; ++ $i) {
      echo "ConvertAllTablesToInnoDB " . $argv[$i] . "... \n";
      ConvertAllTablesToInnoDB($argv[$i]);
}
<?php
// https://helloacm.com/a-simple-php-command-line-tool-to-convert-mysql-tables-from-myisam-to-innodb-in-specified-database/
function ConvertAllTablesToInnoDB($database) {
  define("DB_HOST", "localhost");
  define("DB_USER", "root");
  define("DB_PASSWORD", "password");  
  $conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, $database);
  if (!$conn) {
      echo "Error: Unable to connect to MySQL." . PHP_EOL;
      echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
      echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
      exit;        
  }      
  $sql = "SELECT TABLE_NAME FROM 
      INFORMATION_SCHEMA.TABLES
      WHERE TABLE_SCHEMA = '$database' 
      AND ENGINE = 'MyISAM'
  ";
  
  $rs = mysqli_query($conn, $sql);
  
  while ($row = mysqli_fetch_array($rs)) {
      $tbl = $row[0];
      $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
      echo $sql . "\n";
      mysqli_query($conn, $sql);
  }
}
    
if ($argc < 2) {
      exit( "Usage: php $argv[0] database1 database2 ...\n" );
}

for ($i = 1; $i < $argc; ++ $i) {
      echo "ConvertAllTablesToInnoDB " . $argv[$i] . "... \n";
      ConvertAllTablesToInnoDB($argv[$i]);
}

比如 WORDPRESS 数据库中有很多表, 执行效果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# php convert_to_innodb.php wordpress
ConvertAllTablesToInnoDB wordpress... 
ALTER TABLE `wp_commentmeta` ENGINE=INNODB
ALTER TABLE `wp_comments` ENGINE=INNODB
ALTER TABLE `wp_icl_string_translations` ENGINE=INNODB
ALTER TABLE `wp_imagify_files` ENGINE=INNODB
ALTER TABLE `wp_imagify_folders` ENGINE=INNODB
ALTER TABLE `wp_itsec_lockouts` ENGINE=INNODB
ALTER TABLE `wp_itsec_log` ENGINE=INNODB
ALTER TABLE `wp_itsec_temp` ENGINE=INNODB
ALTER TABLE `wp_links` ENGINE=INNODB
ALTER TABLE `wp_options` ENGINE=INNODB
ALTER TABLE `wp_postmeta` ENGINE=INNODB
ALTER TABLE `wp_posts` ENGINE=INNODB
ALTER TABLE `wp_term_relationships` ENGINE=INNODB
ALTER TABLE `wp_term_taxonomy` ENGINE=INNODB
ALTER TABLE `wp_termmeta` ENGINE=INNODB
ALTER TABLE `wp_terms` ENGINE=INNODB
ALTER TABLE `wp_usermeta` ENGINE=INNODB
ALTER TABLE `wp_users` ENGINE=INNODB
ALTER TABLE `wp_wc_download_log` ENGINE=INNODB
ALTER TABLE `wp_wc_webhooks` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_api_keys` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_attribute_taxonomies` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_downloadable_product_permissions` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_log` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_order_itemmeta` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_order_items` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_payment_tokenmeta` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_payment_tokens` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_sessions` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_shipping_zone_locations` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_shipping_zone_methods` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_shipping_zones` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_tax_rate_locations` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_tax_rates` ENGINE=INNODB
ALTER TABLE `wp_wpio_images` ENGINE=INNODB
ALTER TABLE `wp_yith_ywpar_points_log` ENGINE=INNODB
# php convert_to_innodb.php wordpress
ConvertAllTablesToInnoDB wordpress... 
ALTER TABLE `wp_commentmeta` ENGINE=INNODB
ALTER TABLE `wp_comments` ENGINE=INNODB
ALTER TABLE `wp_icl_string_translations` ENGINE=INNODB
ALTER TABLE `wp_imagify_files` ENGINE=INNODB
ALTER TABLE `wp_imagify_folders` ENGINE=INNODB
ALTER TABLE `wp_itsec_lockouts` ENGINE=INNODB
ALTER TABLE `wp_itsec_log` ENGINE=INNODB
ALTER TABLE `wp_itsec_temp` ENGINE=INNODB
ALTER TABLE `wp_links` ENGINE=INNODB
ALTER TABLE `wp_options` ENGINE=INNODB
ALTER TABLE `wp_postmeta` ENGINE=INNODB
ALTER TABLE `wp_posts` ENGINE=INNODB
ALTER TABLE `wp_term_relationships` ENGINE=INNODB
ALTER TABLE `wp_term_taxonomy` ENGINE=INNODB
ALTER TABLE `wp_termmeta` ENGINE=INNODB
ALTER TABLE `wp_terms` ENGINE=INNODB
ALTER TABLE `wp_usermeta` ENGINE=INNODB
ALTER TABLE `wp_users` ENGINE=INNODB
ALTER TABLE `wp_wc_download_log` ENGINE=INNODB
ALTER TABLE `wp_wc_webhooks` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_api_keys` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_attribute_taxonomies` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_downloadable_product_permissions` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_log` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_order_itemmeta` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_order_items` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_payment_tokenmeta` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_payment_tokens` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_sessions` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_shipping_zone_locations` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_shipping_zone_methods` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_shipping_zones` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_tax_rate_locations` ENGINE=INNODB
ALTER TABLE `wp_woocommerce_tax_rates` ENGINE=INNODB
ALTER TABLE `wp_wpio_images` ENGINE=INNODB
ALTER TABLE `wp_yith_ywpar_points_log` ENGINE=INNODB

英文: A Simple PHP Command Line Tool to Convert MySQL Tables from MyISAM to InnoDB in Specified Database

GD Star Rating
loading...
本文一共 275 个汉字, 你数一下对不对.
把 MySQL 中的 MyISAM 表格转换成 InnoDB 的PHP小工具. (AMP 移动加速版本)
上一篇: 我的AMAZON面试经历与经验之谈(亚麻伦敦面经)
下一篇: 定期请人来家里割草 - 把费时费力的活外包出去

扫描二维码,分享本文到微信朋友圈
47199a757d2eecf317e0e55162030dfa 把 MySQL 中的 MyISAM 表格转换成 InnoDB 的PHP小工具 I.T. PHP是最好的语言 数据库

评论