日志和innodb文件这两个角色的目的是不同的。
先举个例子来说明:
你有一本没有目录的书,当你需要查询某个章节的时候,你唯一的办法就是从前往后进行翻阅书本来找到。
在你从前往后翻阅书的内容的过程中,不断记录下书的目录,直到你走完整个书本。下次你需要查询某个章节的时候只需要翻阅目录就可以快速的查到你需要的内容,而不需要翻完整本书。
没有目录的整本书相当于日志文件,目录相当于innodb的索引文件。
你在建立目录的过程实际上是在将无结构的数据建立起结构,数据有了结构以后就能满足我们某种形式的查询。
想象数据库中不断插入的数据为一本不会写完的书再不断地添加新的内容,每次添加完以后我们都要审视添加的内容找出其中的目录并添加到我们的目录页中。
向书中添加内容相当于在日志文件中不断添加数据,这个操作非常简单,只需要在书本最后贴上内容即可,不需要去审视内容。
建立目录很明显较为麻烦,你得审视增加的内容,找到目录并建立目录。
向书中添加内容等价于log.append(更快,只需要简单的记录操作)。
建立目录等价于向innodb索引文件中添加新的索引(较慢,需要遍历,计算等操作)。
在实际情况中,这本书的内容不是需要顺序阅读的书,所以这本书的内容是乱序的,第一章的内容可能会在最后,最后一章的内容可能会在最前面.但是生成的目录,为了保证顺序(因为我们需要查阅),我们会根据到来的内容的不同,选择性插入找到目录在目录文件中的位置,插入目录的数据.
此时,
插入新的目录 == 随机写
不断添加新的书的内容(乱序的章节) == 顺序写
反映到数据库中,各种增删改查的操作我们可以认为是原始的数据流,每当有这样一个操作过来,我们就顺序地记录在日志文件之中(顺序的操作磁盘进行写入).
原始的数据流的到来,我们需要变更之前的索引数据,索引数据是有结构的数据,变更的索引数据在磁盘中位置可能并不相同,这时我们就需要找到对应的位置变更数据(随机的磁盘写入).
现在可以回答你的问题,
1.为什么日志是顺序io而innodb数据文件不是?
日志是无结构的数据,只关注于记录,不管什么样的数据到来只管append
2.一个磁盘里多个进程写多个大文件,日志还是顺序读写吗?
日志本身是否顺序写和操作者无关,根据到来数据的早晚, 它只会不断向后添加内容
3. 如果innodb和日志一样只增加不修改不删除,它会是顺序写吗?
就像刚才说的书本的例子一样,新到来的书本的章节内容是乱序的,你仍然要在已生成的书本的目录文件中找到对应章节的位置去进行插入,这样一个寻址的过程就是随机写.索引文件一定是按照一种结构顺序的(B+ tree),但是到来的数据不一定是按照这个顺序的,所以就必须得寻找位置,插入索引数据,这必然是一个随机写的过程.
4.顺序/顺序读、随机写/读 必然是两两同时出现的吗,比如上面一个磁盘里多个进程写多个大文件的情况下,有没有可能出现随机写,顺序读?
参见上面的解释.
5.以上问题主要是就机械硬盘来问的,固态需要过多的考虑顺序和随机io的问题吗?
寻址是耗费时间的操作,在机械硬盘上体现的更明显,但在固态硬盘上也并非可以忽略不计.你的数据如果是连续的,你只需要寻址一次,然后将数据按顺序写入即可.(这就是日志文件append).如果你的数据不是连续的,你需要针对每一个不连续的数据进行寻址,这样当然就会更慢.(除了寻址,还有一些其它影响速度的设计,比如磁盘缓冲),所以不管是什么磁盘,都要考虑随机和顺序io的问题.