MYSQL记录

日积月累,不积跬步,努力提高自己的能力,利用琐碎的时间来学习一下数据库!记录所学的内容,以便日后查询

1、视图

什么是视图呢?就是把复杂的语句简化成一条简单的SQL语句,可以想象为别名操作,就跟C++里的using ptr = shared_ptr<int>似的。别名操作,简化操作。

select student.id,name,courseName,grade from  student
left join course on student.id = course.id;

比如这样稍长的语句,如果我们使用视图可以简化这个sql语句,首先我们创建一个视图。

create view SelectView as select 
student.id,name,courseName,grade from  student 
left join course on student.id = course.id;

以后再想使用这个操作,可以直接视图来进行查询

select* from selectview;

如果是单表,修改视图的数据会改变原始表的数据。两个连接以上修改视图的数据是不会影响原始表的。

删除视图

drop view selectview

2、慢查询日志

记录耗时长的操作,我们先看一看有没有打开慢查询日志,打开日志功能也是耗时的所以有时候默认都是不打开的。如果log是OFF,我们给他打开一下

show variables  like '%slow%';

在这里插入图片描述
执行这个操作进行打开,记住哦,这个是全局变量,所以要加个glboal;

 set global slow_query_log=on;

查询数据库对慢操作的时间限定在多少秒之内

 show variables like '%long%';

在这里插入图片描述
把第一个值修改一下

set long_query_time = 2;

在一开始show variables like ‘%slow%’;的操作中就已经得到了日志文件的目录,一定要确保慢查询日志是开启的,开启才会记录的。

一个简单慢操作的测试:select sleep(6);查看慢查询文件日志,发现已经记录于此了
在这里插入图片描述

3、explain

explain来查看查询语句是否使用了索引,性能上分析
explain加具体的查询语句
在这里插入图片描述

4、索引

创建一个普通的索引create index nameIndex table tableName(属性名),create index nameIndex table student(name);'name’是一个属性。
查看是否有索引show index from student
show index from student\G查看具体索引属性
在这里插入图片描述

drop index nameIndex on nameTable

数据量大的时候,索引会建的慢,但是查询起来巨快,建了索引并不一定会快,要看怎么去使用,如果有like ‘%‘模糊查询还是会扫描一遍的。

索引的最左匹配原则,先看左边的,如果都是=等号,继续往右边走,如果发现是范围查询,那么走完之后就不再是索引了而是全表扫描了。所以要选择恰当的索引。
参考博客的链接
美团技术文章链接

为什么B/B+树可以减少I/O次数?就是用到了磁盘预读,就是让一个结点变大,和页的大小一致,这样访问一个结点进行一次I/O,这是红黑树不可以做到的地方。所以这也解释了访问一个结点就是进行了一次IO操作

索引失效的情况

  • 最左匹配原则,比如索引是a,b,c这三个列结果where是b或者c开局,没有按照依次的顺序。还有就是只有a,c这种情况,把b省略了,都会造成索引失效。
  • 范围查询也会造成索引失效,还是a,b,c这个三列是索引,where a = 1 and b like “2%” and c,这种情况a和b是使用索引的,后面的c就是要全部扫描了。当范围有限的时候可以用多个等值来连接。

索引的好处

  • 查找速度变快了
  • 可以帮助服务器排好序和避免临时表了
  • 随机IO变成顺序IO了

5、脏读、不可重复读、幻读都是啥

脏读

读取到了未提交的事务

不可重复读

事务A两次查询语句一模一样,但是读到的东西不一样,因为事务B修改了且提交了事务,两次读的数据不重复,本应该在一个事务里是一样的,但现在不一样了数据不重复了所以称为不可重复读。

幻读

A事务第一次查询有100条记录,第二次查询有200条记录,这数量咋又不一样了?原来又是B事务这小子新增了100条记录,给A造成了幻觉,称之为幻读

不可重复读和幻读区别?

我刚开始学的时候我也在想,都是事务A查询两次,两次结果不一样,有啥区别呢?
不可重复读针对的是update操作,幻读针对的是insert和delete操作。针对的操作不同罢了
参考博客链接
数据库隔离级别

6、引擎

MyISAM是表锁,对整表都进行加锁,适用于读操作,不适合大量写操作,并发想对低
InnoDB支持事务,是行锁,并发相对高,读写都可以

参考博客链接

7、B+和B树

在查找一个树值范围的时候,B树中间结点也会保存值,还在去遍历他的结点才能取得一个范围,而B+树的信息都存放在他的叶子结点了,中间结点存放的是下面的数值大小区间而不是具体的信息,而且B+树叶子结点都连在一起了像链表一样,所以B+树查找一个值的范围时候会优于B树的。

8、子查询执行顺序

以前真的没怎么思考过子查询顺序,一直都以为先执行子查询呢,直到今天做了一道mysql的题目,如此诡异的子查询让我蒙逼了。我不禁思考子查询的顺序,我百思不得其解啊,如果按照先执行内部的话这咋能对啊。我真是没想明白,搜了一下解释,终于明白了,这执行顺序原来与关联子查询和非关联子查询有联系啊。看最下面的图
在这里插入图片描述
对上述答案诡异的写法一种解释
在这里插入图片描述
在这里插入图片描述

9、启动事务

start transaction with consistent snapshot 使用这个是直接创建视图了,在可重复读的隔离级别下很有用
begin/start transaction 这个是在有sql语句的时候才会创建视图
核心区别就是创建视图的时机不同
极客时间mysql45讲
在这里插入图片描述

10、mysql乐观锁

是table加了一列,大概列名为version,通过这个来update修改值的

update 行锁的细节

mysql 版本8实验的
在RR(可重复读)隔离级别下,如果在一个事务中,where的字段是没有索引的,是会锁表的。包括使用limit 1的手段,还是会锁其他表的。有索引是会只锁行的,当然是针对where的列,而不是set的列

在RC(读提交)隔离级别下,确实是只锁一行,而不是全局锁。

create table T (ID int primary key,
k int NOT NULL DEFAULT 0, 
s varchar(16) NOT NULL DEFAULT '')engine=InnoDB;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值