在计算机中,数据是存储在文件中,文件放在
磁盘中的,磁盘的维度,有两个指标
1、寻址:速度是ms级别的
2、带宽:单位时间,有多少数据会流过去,单位是M,G级别
内存
1、寻址:ns级别的
秒的单位 秒>毫秒>微妙>纳秒
在寻址上,内存的寻址速度是磁盘的10万倍
2、带宽:也是远远大于磁盘
I/O buffer:成本问题
磁盘与此单,扇区,一扇区 512byte,如果数据过大,带来成本变大:索引
所以在格式化磁盘的时候,会有4k对齐,即基本单位,最小为4k,所以在操作系统中,无论你读多少,最少都是4k从磁盘中拿。在MySQL中,innodb引擎,每次读取,最小单位为16k。
文件放在磁盘中,在Linux中,可以通过grep awk读取,java中也可以通过程序io读取,随着文件的变大,速度就会变慢,因为硬盘已经成为了io瓶颈
所以数据库出现了,数据库也有个概念
data page:大小也为4k,与硬件磁盘对应,正好每次读取的时候,就是一次io
数据库的索引即可大大的提升查询速度
关系型数据库建表:必须给出schema
类型:字节宽度
每行宽度就已经定死了,如果后面你插入数据,宽度定死,已经确定,基本都是行级存储,插入也已经占位,以后增删改,不用移动数据,已经定死
数据和索引都是存入在磁盘中,真的查询的时候,在内存中准备一个b+树,所有的叶子节点就是索引。树干都在内存中,树干中查询命中,就会将磁盘中的data page放入内存中。
数据库表很大的时候,性能下降?
如果表有索引,增删改变慢
查询
1、走了索引,少量查询依然很快
2、并发大的时候,可能获取很多data page到内存中,受到硬盘带宽影响速度
磁盘中会较慢,如果全用内存的数据库,价格太高。所以折中就提出了缓存的概念,即Redis,memcache