数据库数据本身存在硬盘当中,只有当使用的时候才会加载到内存中,并且用到哪一部分加载哪一部分。
由于一切通信的底层都是socket,所以可以知道socket也是一直监听着3306。
mybatis与jdbc的关系:
mybatis引入jar包,jar包里面就是jdbc。mybatis的底层也是依托着jdbc,是在jdbc的基础之上做的功能增强。所以mybatis的核心就是jdbc。而jdbc可以向数据库发送信号,所以jdbc里面也有socket,一切可通信的底层都是socket。
硬盘上的数据是以文件形式存储的。mysql会创建属于自己的一个文件夹,里面会有很多实例,每个实例就是一个文件夹,数据库中每个表就是一个文件。
mysql执行sql语句:接收到sql语句的时候,这个语句就是字符串,就是从硬盘中找出相应的表,拷贝到mysql下,进行操作。
索引:建一个排序列,对一张表的某一列进行排序。抽出一列重新排序。
索引工作原理:索引就是形成一个排序文件,他是采用B+树和hashMap结构,可以通过o(1)或者o(n)级别将文件取出来。
索引文件与原文件是怎么关联的?
这一列的数据构成hashMap或者B+树的时候,都会带着自己的行号,存储着所在行的地址。所以通过索引文件找到这个列之后,顺着这个行地址直接对原文件进行定位。
数据库的内部运行原理:
首先数据库内部通过socket监听端口,java或其他语言通过tcp/ip协议给3306这个端口发送sql语句,mysql监听端口会拿到这个sql语句,然后对这个sql语句进行解析,这个语句本身是字符串类型的,然后对里面的空格、关键字什么的对这个语句进行分析,确定对哪些表进行操作。然后将这些表文件从磁盘中加载到内存当中,进行增删改查的处理,如果是查询的话直接进行筛选,如果是更新的话修改表文件,再返回原文件,插入直接在末尾添加一条数据,删除就直接把这个节点删除,在将表更新回去。
如果依托于索引的话,mysql操作表的时候,会先加载索引文件到内存,根据索引文件会很快的定位到要操作的数据上,再根据索引文件记载的行的地址直接去磁盘的原文件直接定位到那个数据,然后将这个表数据加载到内存中直接进行修改。
索引与不加索引的区别:
不加索引的话,每次mysql都会从磁盘中拷贝一份全部的数据加载到内存中,并且挨个遍历,o(n)级别,并且占内存,存活时间长。
而索引只是加载存储数据的行号的文件到内存中,然后通过文件中记录的每个数据的行号,去硬盘中直接查找,并加载到内存,o(1)级别。
即便加索引的情况下,如果原表过大,也会产生问题。消耗内存,消耗IO,传输的总线有个上限,如果表过大的话,都在总线上传,这个表会使得总线负载过大,对CPU造成压力。
所以我们对大表进行分表,拆分成多个小表,比如身份证最后一位为x的放在一个表,最后一位为1的放在一个表,到时候只需要将这个小表记载到内存中就行了。