| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> mysql笔记 -> 正文阅读 |
|
[大数据]mysql笔记 |
MySQL体系结构
存储引擎特点InnoDB底层文件xxx.ibd:xxx代表的是表名,innoDB引擎的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。 是否使用独立表空间可以通过 在配置文件(my.cnf)中设置: innodb_file_per_table = 1 #1为开启,0为关闭 通过 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kf7DE43Z-1644765304996)(D:\Users\wbo112\Documents\typora-user-images\image-20220213230716243.png)] 也可以通过 MyISAM底层文件xxx.sdi:存储表结构信息 xxx.MYD: 存储数据 xxx.MYI: 存储索引 索引慢查询日志
慢查询日志记录了所有执行时间超过参数 long_query_time 设置值并且扫描记录数不小于 min_examined_row_limit的所有的SQL语句的日志,默认未开启。long_query_time 默认为 10 秒,最小为 0, 精度可以到微秒。
在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
重启MYSQL服务生效。 默认慢查询日志文件位置/var/lib/mysql/localhost-slow.log
profile详情show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。
explain执行计划EXPLAIN 或者 DESC命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。 ? ? Id: select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。 ? ? select_type: 表示 SELECT 的类型,常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等 ? ? type: 表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、 index、all 。 ? ? possible_key: 显示可能应用在这张表上的索引,一个或多个。 ? ? key: 实际使用的索引,如果为NULL,则没有使用索引。 ? ? key_len: 表示索引中使用的字节数, 该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下, 长度越短越好 。 ? ? rows: MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的。 ? ? filtered: 表示返回结果的行数占需读取行数的百分比, filtered 的值越大越好。 索引使用
索引设计原则
SQL优化插入数据
主键优化
当删除一行记录时,实际上记录并没有被物理删除,只是记录被标记(flaged)为删除并且它的空间变得允许被其他记录声明使用。 当页中删除的记录达到 MERGE_THRESHOLD(默认为页的50%),InnoDB会开始寻找最靠近的页(前或后)看看是否可以将两个页合并以优 化空间使用。
order by优化① Using filesort: 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区 中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 排序。 ② Using index: 通过有序索引顺序扫描直接返回有序数据,这种情况即为 ,不需要额外排序,操作效率高。 ? 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。 ? 尽量使用覆盖索引。 ? 多字段排序 一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC )。 ? 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认256k) 。 group by优化? 在分组操作时,可以通过索引来提高效率。 ? 分组操作时,索引的使用也是满足最左前缀法则的。 limit优化一个常见又非常头疼的问题就是 limit 2000000,10 ,此时需要MySQL排序前2000010 记录,仅仅返回2000000 - 2000010 的记录,其他记录丢弃,查询排序的代价非常大 。 优化思路: 一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过覆盖索引加子查询形式进行优化。
count优化? MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高; ? InnoDB 引擎就麻烦了,它执行 count() 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。 优化思路:自己计数。
? count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加,最 后返回累计值。 ? 用法:count(*)、count(主键)、count(字段)、count(1)
? ? count(主键) ? InnoDB 引擎会遍历整张表,把每一行的 主键id 值都取出来,返回给服务层。服务层拿到主键后,直接按行进行累加(主键不可能为null) ? ? count(字段) ? 没有not null 约束 : InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,服务层判断是否为null,不为null,计数累加 。 ? 有not null 约束:InnoDB 引擎会遍历整张表把每一行的字段值都取出来,返回给服务层,直接按行进行累加。 ? ? count(1) ? InnoDB 引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字“1”进去,直接按行进行累加。 ? ? count(*) ? InnoDB引擎并不会把全部字段取出来,而是专门做了优化,不取值,服务层直接按行进行累加。 按照效率排序的话,count(字段) < count(主键 id) < count(1) ≈ count(*),所以尽量使用 count(*)。 update优化InnoDB的行锁是针对索引加的锁,不是针对记录加的锁 ,并且该索引不能失效,否则会从行锁升级为表锁 。
视图介绍? 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视 图时动态生成的。 ? 通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。 创建
查询
修改
删除
视图的检查选项当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定 义。 MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。 为了确定检查的范围,mysql提供了两个选项: CASCADED 和 LOCAL ,默认值为 CASCADED 视图的更新要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。 如果视图包含以下任何一项,则该视图不可更新:
作用? 简单 视图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操 作每次指定全部的条件。 ? 安全 数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据 ? 数据独立 视图可帮助用户屏蔽真实表结构变化带来的影响。 系统变量查看系统变量
设置变量的值
锁全局锁全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都 将被阻塞。 其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。
表级锁表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中。 对于表级锁,主要分为以下三类:
行级锁行级锁,每次操作锁住对应的行数据。锁定粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。 InnoDB的数据是基于索引组织的,行锁是通过对索引上的索引项加锁来实现的,而不是对记录加的锁。对于行级锁,主要分为以下三类:
InnoDB引擎逻辑存储结构架构MySQL5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。下面是InnoDB架构图,左侧为内存结构,右 侧为磁盘结构。 架构-内存架构架构-磁盘结构示例:
架构-后台线程查看innod的状态信息
事务原理事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作 要么同时成功,要么同时失败。 特性 ? 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。 ? 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。 ? 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。 ? 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。 事务的原子性,一致性,持久性通过 事务的隔离性通过锁, 重做日志,记录的是事务提交时数据页的物理修改,是用来实现事务的持久性。 该日志文件由两部分组成:重做日志缓冲(redo log buffer)以及重做日志文件(redo log file),前者是在内存中,后者在磁盘中。当事务 提交之后会把所有修改信息都存到该日志文件中, 用于在刷新脏页到磁盘,发生错误时, 进行数据恢复使用。 回滚日志,用于记录数据被修改前的信息 , 作用包含两个 : 提供回滚 和 MVCC(多版本并发控制) 。 undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之 亦然,当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容 并进行回滚。 Undo log销毁:undo log在事务执行时产生,事务提交时,并不会立即删除undo log,因为这些日志可能还用于MVCC。 Undo log存储:undo log采用段的方式进行管理和记录,存放在前面介绍的 rollback segment 回滚段中,内部包含1024个undo log segment。 MVCC-基本概念
MVCC-实现原理记录中的隐藏字段
undo log回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。 当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。 而update、delete的时候,产生的undo log日志不仅在回滚时需要,在快照读时也需要,不会立即被删除。 undo log版本链如上图:
readviewReadView(读视图)是 快照读 SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。 ReadView中包含了四个核心字段:
不同的隔离级别,生成ReadView的时机不同: ? READ COMMITTED :在事务中每一次执行快照读时生成ReadView。 ? REPEATABLE READ:仅在事务中第一次执行快照读时生成ReadView,后续复用该ReadView。
MySQL管理Mysql数据库安装完成后,自带了一下四个数据库,具体作用如下:
常用工具:该mysql不是指mysql服务,而是指mysql的客户端工具。 -e选项可以在Mysql客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。 可以通过通过 mysqladmin 是一个执行管理操作的客户端程序。可以用它来检查服务器的配置和当前状态、创建并删除数据库等。 由于服务器生成的二进制日志文件以二进制格式保存,所以如果想要检查这些文本的文本格式,就会使用到mysqlbinlog 日志管理工具。
mysqlimport 是客户端数据导入工具,用来导入mysqldump 加 -T 参数后导出的文本文件。 如果需要导入sql文件,可以使用mysql中的source 指令 。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 11:44:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |