我使用 MySQL 作为我当前 Web 项目的数据库。我是 MySQL 的新手。请向我解释 InnoDB 和 MyISAM 之间的区别。
特别是,当 MyISAM 和 InnoDB 都没有缺少必需的功能(例如,您不需要外键)时,您如何在两者之间进行选择。
它总是归结为尝试和测量吗?或者是否有关于读取与写入的数量和频率以及其他类似措施的良好经验法则?表的大小对典型选择有影响吗?
以前,在创建的每个数据库上,我使用:
mysql -u root -p
CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL ON dbname.* TO 'dbuser'@'localhost';
Run Code Online (Sandbox Code Playgroud)
然后不用考虑 MyISAM 或 InnoDB 就可以使用数据库
如何知道数据库使用的存储引擎?
我在两台机器之间的 MySQL 5.5 复制性能方面遇到了严重问题,主要是带有基于语句的复制的 myISAM 表。二进制日志和 mysql 数据目录都位于同一个 Fusion ioDrive 上。
最近当我们需要暂停复制大约时,这个问题是一个大问题。3小时。在没有其他负载的情况下,大约需要 10 个小时才能再次赶上。

如何提高复制的性能?机器 B 基本上是空闲的(很少,IO,16 个内核中有 2 个最大化,大量空闲 RAM),因为只有 1 个 mySQL 线程正在写入数据。以下是我的一些想法:
主要问题是,如果在暂停 3 小时后需要 10 小时才能赶上,这意味着复制在 10 小时内写入 13 小时的数据,或者能够以数据传入速度的 130% 写入。我正在寻找近期至少要在Master机器上双写,所以迫切需要一种提高复制性能的方法。
my.cnf:
[mysqld]
server-id=71
datadir=/data_fio/mysqldata
socket=/var/lib/mysql/mysql.sock
tmpdir=/data_fio/mysqltmp
log-error = /data/logs/mysql/error.log
log-slow-queries = /data/logs/mysql/stats03-slowquery.log
long_query_time = 2
port=3306
log-bin=/data_fio/mysqlbinlog/mysql-bin.log
binlog-format=STATEMENT
replicate-ignore-db=mysql
log-slave-updates = true
# Performance …Run Code Online (Sandbox Code Playgroud) 以前,我使用这个:
USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;
Run Code Online (Sandbox Code Playgroud)
我正在寻找更简单的方法来转换数据库中的所有表,而不是一个一个地写每个表名
我有一个大约有 10 亿行的表,它的 98% 是读取密集型的。
我尝试使用不同的存储引擎(MyISAM 和 InnoDB)调整数据库
然后运行了一些测试以查看性能
在 where 子句中,我有一个主键 ID,而且似乎由于 MyISAM Key Cache 将所有索引存储在其缓冲区中,因此使用 MyISAM 似乎非常快,大约比 InnoDB 快 2 倍
但是对于 InnoDB 来说,它似乎更慢了!!是不是 InnoDB 不使用任何缓冲区来预加载索引?
我正在为我的 mysql 服务器寻找备份解决方案,我需要尽可能少的停机时间。我有以下几点:
这个数字可能会增长,因此设置主/从复制不是一个好主意。
我认为最简单的备份方法是将 mysqldump 与诸如“automysqlbackup”之类的软件一起使用。我最重要的数据使用 InnoDB。我的 InnoDB 表很重。
问题是:如果我对服务器中的所有数据库进行 mysqldump,它会锁定我的 Innodb 表吗?
我的 MySQL 服务器快用完了 HD 空间。我的大部分大表都使用 InnoDB 引擎(没有关键任务的原因)。为了避免可怕的“删除数据库以恢复 innodb 磁盘空间”响应,我想更好地了解这两个引擎如何在磁盘上存储数据。
我们正在尝试诊断 MySQL 5.0 的死锁问题。目前所有的表都是 MyISAM 表,所以所有的锁都是表锁。我们有一个很好table_locks_waited的table_locks_immediate比率(低于 1:1000),但在几分钟内我们会遇到一些僵局。这仅发生在 Amazon EC2 上,而不发生在我们的任何其他服务器上。
有没有办法记录所有无法立即获得表锁的查询?我们希望查看对table_locks_waited数字有贡献的所有查询。
我们有一个在 Debian etch (!) 上运行 MySQL 5.0 的数据库服务器,并决定是时候升级了。它现在在 Debian 挤压上运行 5.1。
该数据库服务器在 SATA RAID 阵列上有大约 1.2TB 的 MyISAM 数据和 2GB 的内存。通常速度不是这个服务器运行的查询的一个因素,它主要是后台的东西。
升级时,Debian 软件包运行维护脚本来升级表,但升级每个表需要很长时间。长,我的意思是每张桌子大约需要 18 个小时,而按照目前的速度,做很多事情大约需要 6 周。这是一个相当大的问题。
我试过将全局 key_buffer 增加到 512MB,这似乎符合建议,但没有效果。
问题似乎是它使用了“Repair with keycache”方法,这比 sort 方法慢得多:
mysql> show processlist;
+-----+------------------+----------------------------------+------------------+---------+-------+----------------------+--------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-----+------------------+----------------------------------+------------------+---------+-------+----------------------+--------------------------------------------------------------------------+
| 5 | debian-sys-maint | localhost | xxxxxxxxxxxxxxxx | Query | 45146 | Repair with keycache | REPAIR TABLE `xxxxxxxxxxxxxxxx`.`xxxxxxxxxxxxxxxxxxxx`
Run Code Online (Sandbox Code Playgroud)
由于需要升级,其他表无法访问:
mysql> …Run Code Online (Sandbox Code Playgroud) myisam ×10
mysql ×10
innodb ×7
amazon-ec2 ×1
database ×1
logging ×1
performance ×1
replication ×1