B+树索引使用(9)分组、回表、覆盖索引(二十一)
上篇文章我们说了索引排序和排序注意事项,排序不要用复杂的函数,范围查找的时候,左边的列有索引效果,后面的列没有,除非指定特定值,like模糊查询时候,前面不要用%,asc desc不要混用。索引排序之所以快,因为b+树里面的双向链表和单向链表数据结构原本就是按索引从小到大排序好的,所以直接取出数据就好,不需要在磁盘和内存中排
B+树索引使用(8)排序使用及其注意事项(二十)
上篇文章我们介绍了匹配列前缀,因为索引排序按字母一个个比较的特性,如果%在前面则不能触发索引,还有范围匹配,范围查询的时候,左边的列可以触发索引,当前面有值的时候,比如name = ‘’,第二个范围也能触发索引,之后的则不可以触发索引。
B+树索引使用(7)匹配列前缀,匹配值范围(十九)
上篇文章索引的代价,b+树占的空间比较大,增删改对b+树每个节点的索引排序影响也很大,事件耗费长,所以没有必要不要乱建索引,还介绍了索引的左原则和全值查询。
B+树索引使用(6)左原则 --mysql从入门到精通(十八)
上篇文章我们说了,myISAM表和innoDB表的不同,myISAM吧用户记录数据放在数据文件,会给每行数据一个行号,myISAM会给主键生成索引,吧索引页放在索引文件。B+树的叶子节点存储的是主键+行号,意味着次通过主键查询只能查到行号,之后回表,通过行号查询数据文件整行数据。而innoDB的聚簇索引不需要二次查询。
B+树(5)myISAM简介 --mysql从入门到精通(十七)
上篇文章我们说了,联合索引会用两个以上列来创建索引,b+树是一颗,先用c2列排序,若结果相同,则用c3排序。innoDB的b+树特点是根节点保持不变,新表是先默认有聚簇索引,先有一个没有数据的根目录节点,放用户记录数据放入根几点中,当数据慢了,页分裂,会有多的节点,此刻根节点进化成根目录记录节点,数据存入底层节点。二级索引的内节点保证一致性,存入列值的时候加个主键。
B+树(4)联合索引 --mysql从入门到精通(十六)
上篇文章介绍了主键索引(聚簇索引),二级索引(非主键索引,辅助索引),主键索引查询通过根目录记录查询对应的数据页目录。二级索引查询先查询列+页码名称的目录非叶子节点,之后在查询到叶子节点,此刻叶子节点上存储的是主键和列,在通过主键查询整条数据。
B+树(3)聚簇索引,二级索引 --mysql从入门到精通(十五)
上篇文章说了b+树索引的方案,因为用之前二分法查找,前提条件是索引必须是挨着的,而受到用户记录数的启发,建立了和用户记录真实数据页一样的目录记录页(索引),并且高三层,高层是根节点,底层是叶子节点,其他是非叶子节点,record_type为0 代表普通数据页,1代表目录记录页。
B+树索引方案(2) --mysql从入门到精通(十四)
上篇文章我们说了一个简单索引实例,必须满足条件下一个页的小主键必须必上一个页的大主键大,否则会吧大的放到后面页去,这个过程叫做页分裂。查询的时候有个key和page_no组成的查询索引,key就是若干页每个页小的主键,page_no就是页面名称。
B+树索引(1)简易版本索引 --mysql从入门到精通(十三)
前面我们说了innoDB有很多页类型,主要介绍了index索引页,包含七个主要部分。File header里有效验和和file_page_prev和file_page_next吧所有的页联系起来,组成双向链表。Page header里有当前页的槽点和记录数,还有next record来吧每个数据连接起来,组成单链表。查询的时候有page directory。File trailer里的效验和能检验数据是否完成。如果上面说的这些你都不明白,建议吧前面的文章再看一看,接下来的知识不适合你。什么?前面内容太多,太生涩看不懂?好的,等我!
InnoDB(7)数据持久化 --mysql从入门到精通(十二)
上篇文章我们说了,索引页分为7个部分,其中free space会给user recoreds分配空间存储真实数据,直到用完申请新的页。查询拥有page directory,会分成不同的槽点,小槽点有一个值,大槽点有1~8个值,查询的时候用二分查找法定位id的槽点,然后遍历当前槽点就好。
InnoDB(6)索引页select --mysql从入门到精通(十一)
上篇文章介绍了innoBD会有若干索引页,每个索引页的两个虚拟列,infimun小虚拟行记录,supremun大虚拟行记录,这两个存在innoDB的头部信息,里面还有delete_mark,next_record等。free space空间会给user records存储的数据申请,直到用完则会申请新的页。
InnoDB(5)索引页 --mysql从入门到精通(十)
上篇文章介绍了行溢出,表中多创建65535个字节,而null值列表占用一个字节,变长字段长度列表占用两个字节,所以长是65532个字节。而varchar(M)填写多少,要根据不同的字符集来规定,比如ascii一个字符是一个字节,gbk大是2个字节,utf8大是3个字节。数据也会溢出,数据溢出,则是会分成若干页存储,而compact行格式,真实数据列表会780左右字节,然后存页的地址值,方便查找剩余的真是数据。Mysql5.7后默认用dynamic行格式,而dynamic行格式在行溢出的情况下真实数据列表只存储页码地址值。Redundant则是会有压缩算法压缩页码分页,更节省空间。
InnoDB(4)行溢出--mysql从入门到精通(九)
上篇文章说了compact行格式中真实数据存储,真实数据innoDB会默认添加transaction_id事务id,roll_pointer回滚指针,其中row_id不是必须的,当用户设置了primery key主键默认用用户设置的,没设置,找一个unique列,若都没有,则会用row_id。
InnoDB(3)记录真实数据--mysql从入门到精通(八)
上篇文章说了,innoDB除了会记录真实数据外,会存储额外数据,额外数据就是描述真实数据的数据,额外数据分为超长字段长度列表,null列表,头部信息,null列表主要存储字段为null的数据,mysql规定是一个字节,8个字节为存储,当只有三个字段的时候,高位默认0填充。变长字段长度列表要看实际情况存储的字符集和定义的varchar大长度。
InnoDB(2)NULL值列表--mysql从入门到精通(七)
上篇文章介绍了InnoDB的compact列类型,存储数据分为真实数据,和额外信息,而额外信息分为变长字段长度列表,null值列表,记录头信息,而变长字段长度列表是要记录varchar,text等长文本,char这种则不存储,当数据为null也不存储,ascii的字节长度为1,乘以varchar(m)的长字符创长度,1*M若小于255,则用一个字节存储字段长度,若大于255,当真实数据长度小于127,则一个字节存储,大于则两个字节存储长字段长度。
InnoDB(1)变长字段长度列表--mysql从入门到精通(六)
我们之前说到过mysql-service和存储引擎,mysql-service包含tcp/ip连接、查询缓存,解码sql语句,优化sql语句。Mysql服务器支持不同的存储引擎,如InnoDB、MyISAM、Memory等,不同的存储引擎拥有不同的性能,存放的格式也是不同的,甚至memory都不是吧数据存在磁盘中,也就是服务器关闭,数据就会消息。而InnoDB和myISAM是我们常用的两个存储引擎,所以就先重点介绍支持事务的InnoDB。
Mysql字符集总结(4)--mysql从入门到精通(五)
Mysql服务器从接受客户端请求到返回请求给客户端,字节串编码解码如何进行转换,有三个重要的系统参数,character_set_client,处理客户端发送过来的字节串,注意这里是字节串,客户端会把字符串转成字节串发送过来。还有character_Set_connection,处理发过来的语句,并且解析返回给客户端的字节串,最后还有character_Set_Results解析字节串返回给客户端。一般情况下,都会用set names ‘’,保证这三个参数的字符集一致,防止不必要的转换消耗性能。
Mysql字符集(3)--mysql从入门到精通(四)
上篇文章我们说了mysql客户端到服务端会不同的字符集不断转换,其中服务端有三个重点的系统变量,1.处理客户端发来的字节串:character_set_client。2.吧请求的字节串从character_Set_cliect转成character_set_connection。3.吧字节串返回给客户端:character_Set_result。
Mysql字符集(2)--mysql从入门到精通(三)
上篇我们介绍了mysql字符集的种类,主要windows用gbk,mac默认utf8,还有字符集的服务器级别,数据库级别,表级别,连行都有级别,每一行都可以有不同的字符集
Mysql字符集(1)--mysql从入门到精通(二)
上篇文章我们说了mysql客户端与服务端连接过程,分为tcp/ip连接,之后读取缓存,sql解码,语句优化,存储引擎: