尚硅谷Mysql高级day2(p7-20)

今天是2020-12-27。
一。主要配置文件
1.log-bin:用于主从复制
2.log-error:默认关闭,用于记录严重的警告和错误信息,以及每次启动和关闭的详细信息等
3.log:默认关闭,记录查询的sql语句
4.数据文件:frm文件–存放表结构,myd文件-存放表数据,myi–存放表的索引
二。系统逻辑结构
1.连接层:jdbc等,引入了连接池的概念
2.sql处理层:sql接口–存储过程、视图等,语句转换器,语句优化器、缓存、缓冲区
3.可替换存储引擎层:innoDB,Myisam等
4.文件系统层:完成与存储引擎的交互
三。存储引擎
1.查看数据库默认的存储引擎:show variables like ‘%storage_engine%’
2.InnoDB:支持主外键和事务;使用行锁,适合高并发;缓存索引和真实数据,对内存要求高
3.MyISAM:不支持主外键和事务;使用表锁;只缓存索引
四。sql优化
1.sql慢的原因:等待或者执行时间长–查询语句写的太差、索引失效或者没建索引、关联查询时使用了太多join、服务器的配置参数没设置好
2.sql的执行顺序:from-on-join-where-groupby-having-select-distinct-orderby-limit
大概流程:

1.from:根据指定的数据源得到他们的笛卡尔积
2.on:保留连接时主表的所有数据
3.join:将连接时从表不符合连接条件的数据也以null添加进来
4.where:根据指定条件过滤结果集,不能使用聚合函数和select指定的字段别名
5.groupby:改变对表的引用,可同时指定多个字段,使指定字段的值相同的记录为一组,不能使用聚合函数
6.having:只能出现在groupby以后,对分组结果进行筛选,可使用聚合函数
7.select:返回指定字段的结果,可聚合
8.distinct:select返回指定字段的同时,去除掉重复的字段值
9.orderby:根据指定的字段及排序类型对结果集进行排序,可根据多个字段排序,可使用select指定的字段别名
10.limit:排序后限制结果集的行数,可用于分页,显示指定行数范围内的记录

五。join查询
1.inner join:内连接,只返回满足连接条件的记录
2.left join:左外连接,返回左表的全部记录以及右表满足条件的记录,右表不满足条件的记录以null填充
3.right join:右外连接,返回右表的全部记录以及左表满足条件的记录,右=左表不满足条件的记录以null填充
4.全 外连接:mysql不支持全外连接full join,可以用union模拟,union默认去重,可以union all返回所有记录
5.在外连接的基础上,可以加上where条件,比如左连接a.xxx=b.xxx,where b.xxx is null,这样就可以拿到左表a的独有记录。
六。索引
1.索引是帮助mysql高效获取数据的数据结构
2.索引可以简单理解为排好序的快速查找结构,可以提高查询效率
3.索引两大功能:对字段的值排序、快速查找,实际上就是影响了sql语句中的where和orderby部分
4.索引一般满足特定的查找算法,以某种方式的引用指向数据
5.索引本身比较占内存,不可能全部存储在内存中,一般是集中存储在一个文件中
6.平时所说的索引默认是B树,但是mysql中的普通索引、唯一索引、组合索引等使用的都是B+树
7.mysql中的索引是用b+树实现,因为b+树只用叶子节点存数据,非叶子节点都是叶子节点的索引,所以查找效率就会很高;b+树用于存放数据的叶子节点之间形成了从左到右的单向链表,按其关键码的次序即可遍历全部记录:这也是为什么sql优化中提到使用索引时要满足最左前缀匹配原则:

1.读取创建索引时 指定的字段顺序(从左到右)
2.在构建B+tree非叶子节点时,其会按照 字段从左到右的顺序进行组合,并依次对字段存储的数据按照从小到大的顺序进行排序;最终保证整体索引数据的有序性。注意联合索引的排序指的是对索引中最左边的那个字段的值进行排序,比如说(1,2),(1,1),(2,1),(2,4),(3,1),(3,2),单看一个字段,只有最左的字段值是有序的,右边的单看无序,但是整体是有序的,因为按最左边字段的值来排序。如果说只查找右边的字段,就使用不到根据联合索引最左边的字段构建的索引,因为构建b+树时右边的字段值无序存储。
3.mysql 本身对 B+tree 的叶子节点做了优化,首先叶子节点存储的是当前索引字段关联的所有主键,且对于所有的叶子节点按照从左到右的顺序进行连接构成单链表; 从而其支持 (索引)范围查询
4.对于索引范围查询其特点为 只需要通过定位 起始条件索引叶子节点查询位置 以及 定位 终止条件 索引叶子节点查询位置, 通过直接定位起始叶子节点快速遍历到终止叶子节点,从而提高查询效率

8.索引实际上也是一张表,保存了表的主键与索引字段,并指向了实体表的记录,所以索引也要占用空间
9.如果对建立了索引的字段进行更新删除修改操作,也要更新索引信息,操作的速度就会降低,所以频繁进行增删改的字段不要建立索引。
七。索引分类
1.普通索引:仅包含一个字段,这是最基本的索引,它没有任何限制。可以在创建表的时候指定,也可以修改表结构,如:
ALTER TABLE table_name ADD INDEX index_name (column)
2.唯一索引:唯一索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。可以在创建表的时候指定,也可以修改表结构,如:
ALTER TABLE table_name ADD UNIQUE (column)
3.组合索引:组合索引,即一个索引包含多个列。可以在创建表的时候指定,也可以修改表结构,如:
ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3)
4.主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。
5.全文索引:全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用分词技术等多种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。
可以在创建表的时候指定,也可以修改表结构,如:
ALTER TABLE table_name ADD FULLTEXT (column)
八。查看索引
show index from table_name
九。索引结构
B+tree:

1.对于一颗B+树的结构,我们一般分为三类:根节点、叶节点、叶子节点
2.根节点与叶子节点并不实际的存储数据项,它们存储的是数据的区间以及指向子节点的指针,比如一个叶节点存储:p1、17、p2、25、p3,那么当找到了这个节点以后,我想查找值为20的数据,就要去找p2指针指向的子节点,依次类推找到最后真正存储数据的叶子节点。

十。创建索引时的思考
1.主键就是特殊的唯一索引
2.为表之间的外键关系建立索引
3.频繁作为查询条件的字段应该建立索引
4.频繁更新值的字段不要建立索引
5.where子句用不到的字段不要建立索引
6.出现在orderby中的子句最好建立索引
7.在普通索引和组合索引之间选择,尽量选组合索引
8.出现在groupby子句中的字段最好建立索引
9.表里的记录太少不要建立索引
10.表里涉及增删改操作的字段太多,不要建立索引
11.如果字段的值有很多重复且分布平均,建立索引没有实际效果
12.建立索引时可以粗略计算,字段中不同值的数量/表的记录数,这个值越接近一,索引的效率越高

猜你喜欢

转载自blog.csdn.net/qq_44727091/article/details/111772600