我们都知道 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
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK