提示:mysql学习记录
- 一、mysql的层次结构
- 连接层:
- 服务层:
- 引擎层
- 存储层
- 二、索引
- 1.什么是索引?
- 2.sql执行的先后顺序
- 3.mysql索引的种类?
- 单值索引:一个索引只包含单个列,一个表可以有多个单值索引
- 唯一索引:索引列值必须唯一,但允许有空值
- 复合索引:一个索引包含多个列
- 4.mysql索引的结构?
- Btree索引结构
- B+Tree索引结构
- 思考:为什么说B+树比B-树更适合实际应用中操作系统的文件索引和数据库索引?
- 三、mysql优化器模块 explain
- 怎么用?
- 作用?
- 各字段解释
- id:可以理解为表执行的优先级
- select_type
- table :表名
- type
一、mysql的层次结构
MySQL逻辑可分为四个层次,分别为:连接层,服务层,引擎层,存储层 。
连接层:提供与客户端连接的服务。
当客户端发出一个请求后(如增删改查的SQL语句),首先到达该层,将服务器与客户端建立连接。
常用的与JDBC
服务层分两个作用:
1.提供各种用户使用的接口。 如select、insert等
2.提供SQL优化器(MySQL Query Optimizer)。 SQL优化器是MySQL服务层自带的一个服务,它会自动优化用户写得不是最优的SQL,使其达到优化的效果。但由于优化器毕竟只是优化器,有时候会将用户自定义的优化方案给更改掉,从而使用户自己的优化方案失效,这一点需要注意
引擎层引擎层提供各种数据存储的方式。MySQL的存储引擎有很多,比较常用的比如有InnoDB, MyISAM。
InnoDB与MyISAM的区别为:
InnoDB 事务优先,所以适合高并发操作,使用的是行锁
MyISAM 性能优先,适合查询多的场景,使用的是表锁
存储层
最终的数据存储在存储层。
链接: mysql中innodb和myisam对比及索引原理区别.
链接: Mysql事务以及InnoDB和MyISAM区别讲解.
二、索引 1.什么是索引?索引是一种排好序的可以快速查找数据的数据结构
链接: 对比MyISAM与InnoDB关于锁方面的区别.
2.sql执行的先后顺序 3.mysql索引的种类? 单值索引:一个索引只包含单个列,一个表可以有多个单值索引 唯一索引:索引列值必须唯一,但允许有空值 复合索引:一个索引包含多个列索引的用法:
mysql索引最常用的bTree索引,还包括hash索引,R-tree索引,full-text全文索引
Btree索引结构
【初始化介绍】
一颗b树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),
如磁盘块1包含数据项17和35,包含指针P1、P2、P3,
P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。
真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。
非叶子节点不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。
【查找过程】
如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。
真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。
B+Tree索引结构B+TREE 第二级的 数据并不能直接取出来,只作索引使用。在内存有限的情况下,查询效率高于 B-TREE
B-TREE 第二级可以直接取出来,树形结构比较重,在内存无限大的时候有优势。
B+Tree与B-Tree 的区别:结论在内存有限的情况下,B+TREE 永远比 B-TREE好。无限内存则后者方便
1)B-树的关键字和记录是放在一起的,叶子节点可以看作外部节点,不包含任何信息;B+树叶子节点中只有关键字和指向下一个节点的索引,记录只放在叶子节点中。(一次查询可能进行两次i/o操作)
2)在B-树中,越靠近根节点的记录查找时间越快,只要找到关键字即可确定记录的存在;而B+树中每个记录的查找时间基本是一样的,都需要从根节点走到叶子节点,而且在叶子节点中还要再比较关键字。从这个角度看B-树的性能好像要比B+树好,而在实际应用中却是B+树的性能要好些。因为B+树的非叶子节点不存放实际的数据,这样每个节点可容纳的元素个数比B-树多,树高比B-树小,这样带来的好处是减少磁盘访问次数。尽管B+树找到一个记录所需的比较次数要比B-树多,但是一次磁盘访问的时间相当于成百上千次内存比较的时间,因此实际中B+树的性能可能还会好些,而且B+树的叶子节点使用指针连接在一起,方便顺序遍历(例如查看一个目录下的所有文件,一个表中的所有记录等),这也是很多数据库和文件系统使用B+树的缘故。
思考:为什么说B+树比B-树更适合实际应用中操作系统的文件索引和数据库索引?- B+树的磁盘读写代价更低
B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。
- B+树的查询效率更加稳定
由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。
链接: 索引结构(BTree、B+Tree和Hash等)和分类(聚簇索引与非聚簇索引等).
三、mysql优化器模块 explain 怎么用?explain + sql
作用? 各字段解释所有字段
像上图,id为2 的优先级较高,所以先执行2,也就是t3,然后优先级一样的就从上向下按照顺序执行。s1,t2
优化sql的起步一般是百万数量起步,如果数据量太少优化作用不大



