每个人都知道,在使用 InnoDB 作为引擎的表中,诸如此类SELECT COUNT(*) FROM mytable
的查询非常不准确且非常慢,尤其是当表变大并且在该查询执行时不断插入/删除行时。
据我了解,InnoDB 不会将行数存储在内部变量中,这就是导致此问题的原因。
我的问题是:为什么会这样?存储这样的信息有那么难吗?在许多情况下,这是一个重要的信息。我看到是否要实现这样的内部计数的唯一困难是当涉及事务时:如果事务未提交,您是否计算它插入的行数?
PS:我不是数据库方面的专家,我只是一个将 MySQL 作为一个简单爱好的人。因此,如果我只是问一些愚蠢的问题,请不要过分挑剔:D。
我不小心安装了 MySQL 8 并在那里做了大量工作,创建了大量数据。然后我使用 mysqldump 备份了所有数据库。
后来,我意识到我需要降级回 MySQL 5.7(甚至没有意识到我已经升级了)。
我已经卸载了 8 并安装了 5.7,但是我在从转储的 .sql 文件中导入我的数据时遇到了问题。
首先,我得到了错误ERROR 1273 (HY000) at line 1753: Unknown collation: 'utf8mb4_0900_ai_ci'
,我通过使用 Notepad++ 替换解决了这个错误:
utf8mb4_0900_ai_ci
和 utf8_unicode_ci
utf8mb4
和 utf8
utf8_unicode_520_ci
和 utf8_unicode_ci
然后我还删除了 .sql 文件中与'mysql' 数据库相关的部分。
现在命令mysql < alldb.sql
运行没有错误,但是当我查看我的数据时,很多数据都丢失了。
PS 我对有人可以帮助我感到乐观,但MySQL 8 文档说有点令人担忧:
不支持从 MySQL 8.0 降级到 MySQL 5.7,或从 MySQL 8.0 版本降级到以前的 MySQL 8.0 版本。唯一受支持的替代方法是恢复升级前的备份。因此,您必须在开始升级过程之前备份数据。