mysql
文章平均质量分 50
Pr Young
一个踏实努力,充满激情的程序员!
展开
-
记录锁,间隙锁,临键锁还在傻傻分不清楚?一招教你直达行级锁本质
是为了解决幻读问题,也就是防止一个事务A在查询的时候,另一个事务B在它查询的区间内插入,删除,修改数据,导致事务A前后查询到的行数不一致(比如之前查到的是5行,现在查到了7行数据)。你要防止24这条记录以前的记录被修改成24,也要防止32这条记录被修改成24,也要其他事务先在(24,32)区间内插入一条数据,再将这条数据的age改成24,由于age是非唯一索引,所以可以出现多行的age都是24,显然你只需要锁住id=1这一行记录即可,因为id这一列是主键索引,这样其它行的id是无法修改成id=1的,原创 2023-10-27 17:34:50 · 299 阅读 · 0 评论 -
mysql索引覆盖
如果已经在二级索引B+树上查到了我们想要的数据(比如你想要获取的就是这个主键id,或者联合索引index(a,b,c),你查询select b from table where a=1,也是不用回表的,二级索引b+树的索引字段直接就可以返回b的值),不用回表,这就是索引覆盖,二级索引B+树就可以覆盖到我们所需要的值了。正常查找流程是,我们先在二级索引B+树上查找,然后找到数据所在行的主键id,根据这个主键id去主键索引B+树上查找,获得完整数据(去主键索引B+树中查找数据就是回表)原创 2023-09-04 14:10:13 · 352 阅读 · 0 评论 -
mysql三大日志 undolog,redolog,undolog
②undo log是逻辑日志(针对的是每一行的记录),存储的是数据修改的逆操作(如果执行了一条 UPDATE 语句将某个字段的值从 10 修改为 15,那么 Undo Log 中就会记录一个相应的逆操作,将这个字段的值从 15 修改回 10。(2)bin log是逻辑日志,redo log是物理日志,记录的是哪个数据页的哪个数据被改成什么了,在不同的机器上数据的位置是不一样的,可能在这个机器上是在这个数据页上,在另一台机器,就是在另一个数据页上。(2)undo log和redo log。原创 2023-09-04 14:09:30 · 507 阅读 · 0 评论 -
Mysql底层数据结构为什么选择B+树
(2)如果采用红黑树,虽然插入新元素的过程中会自我平衡,调整位置,但是红叉树终究还是二叉树,树的高度还是太高了,I/O操作太多,多路树B树和B+树具有更低的层高。2.B树的非叶子节点和叶子节点都既存储索引key,又存储数据data,B+树的非叶子节点只存储索引,不存储数据,叶子节点才是既存储索引,又存储数据。3.B树的叶子节点不会存储相邻节点在磁盘中的位置,B+树的叶子节点会存储相邻节点在磁盘中的位置,所以B+树支持范围查询。4.B树不用查到叶子节点就可能查到数据,B+树必须一路查到叶子节点才能查到数据。原创 2023-09-04 14:08:45 · 1292 阅读 · 0 评论 -
各种各样的锁
共享数据加了乐观锁,一个线程操作数据的时候不会上锁,只会判断一下是否有其他线程修改了这个数据,所以乐观锁适合读多写少的场景,因为不用上锁、释放锁,省去了锁的开销,从而提升了吞吐量。如果一个线程调用了methodA,获取了A方法的锁,那就不用再特地去获取方法B的锁,自动获得了方法B的锁。是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。是共享锁的一种实现,读写锁管理一组锁,一个是只读的锁,一个是写锁。读锁可以在没有写锁的时候被多个线程同时持有,而写锁是独占的。原创 2023-03-08 15:32:14 · 341 阅读 · 0 评论 -
索引的分类
索引的分类,如何创建索引原创 2023-04-11 15:12:58 · 585 阅读 · 0 评论 -
count(*)和count(列名) 得到的结果是一样的吗?
当这一列上有null值得时候,count(*)会求出所有行数,count(列名)则不会统计那些值为null的行。当这一列上没有null值的时候,得到的结果是一样的。原创 2023-04-06 17:01:09 · 651 阅读 · 2 评论 -
索引失效的场景
但是select * from table where left(name,2)=”zhangsan“,对索引列进行了函数操作,就不会走索引了。select * from table where name is not null就无法使用索引。比如select * from table where name=”zhangsan“ 是会走索引的。4.is null可以使用索引,但是is not null无法使用索引。2.在索引列上做计算或者函数操作,也会导致索引失效从而进行全表扫描。原创 2023-04-03 23:53:54 · 340 阅读 · 0 评论 -
explain
第四个字段 type 显示查询使用了何种类型 all的话就表示全表扫描,system表示表中只有一行数据或者是空表,const表示最多只有一行记录匹配。显示一条语句的执行计划,比如在select xxx from xxx where xxx 这条语句前面加上explain。倒数第二个字段filtered 查出的结果占查询的行数的百分比,当这个百分比是100%的时候,说明走了索引。第一个字段 id sql查询中的序列号,这个字段越大,越优先执行。原创 2023-03-07 13:49:09 · 90 阅读 · 0 评论 -
InnoDB存储引擎和MyISAM存储引擎
InnoDB存储引擎 表级锁 聚簇索引 支持事务。MyISAM存储引擎 行级锁 非聚簇索引 不支持事务。1.MyISAM 存储引擎:非聚簇索引(索引字段和数据不放在一起)InnoDB存储引擎:聚簇索引(索引字段和数据放在一起)叶子结点中存储的是索引字段+硬盘中的地址。3.InnoDB存储引擎 支持事务。2.InnoDB存储引擎 行级锁。MyISAM存储引擎 不支持事务。MyISAM存储引擎 表级锁。原创 2023-03-06 23:45:00 · 107 阅读 · 0 评论 -
联合索引最左匹配原则
同理 select XXXXX where a>1 and b=2 ,a可以走索引,但是由于a字段用到了范围索引,所以b字段不会走索引。select XXXXX where a=1 and b=1 and c=1 会走索引。注意:主键字段会建一棵b+树作为索引,联合索引也会建一颗b+树作为索引,建立两套索引。select XXXXX where b=1 and c=1 不会走索引。select XXXXX where a=1 and b=1 会走索引。原创 2023-03-06 23:15:53 · 531 阅读 · 0 评论 -
mysql if关键字
一个雇员的id是奇数并且他的名字不是以'M'开头,那么他的奖金是他工资的100%,否则奖金为0。原创 2023-02-28 12:54:18 · 143 阅读 · 0 评论 -
彻底搞懂inner join,left join,right join
站在学生表student表的角度,对于这个表中的每一行去成绩表中查找,是否有student.student_id=grade.student_id的行。将customers客户表和orders订单表进行左连接,对于customers客户表中的每一行都会去orders订单表中进行查找匹配·和inner join一样,对于A表中的每一行,都会去和B表中的每一行进行比较,符合条件的就将表A中的行和表B的行进行连接。另外,表A中的每一行都会被保存(即使在B表中没有与其匹配的行,表A的这一行也要保存下来)原创 2023-02-28 12:35:38 · 997 阅读 · 1 评论 -
sql语句怎么匹配到值为null的行
sql语句怎么匹配到值为null的行原创 2023-02-27 23:36:10 · 277 阅读 · 0 评论 -
leetcode上的sql题
选择其中a.managerId=b.id而且a.salary>b.salary的行。自连接也会进行笛卡尔乘积,只不过进行笛卡尔成绩的两张表是同一张表而已。经典题目:部门工资最高的员工,部门工资第N高的员工。1号员工,他的经理就是3号员工。182 查找重复的电子邮箱。前4列来自a表,后4列来自b表。181 超过经理收入的员工。原创 2023-02-23 09:15:34 · 103 阅读 · 0 评论 -
mysql三大日志
mysql先将数据从磁盘中读到buffer pool缓存页中,然后再buffer pool缓存页中进行修改数据,此时缓存页中的数据和磁盘中的数据就不一致,如果这个时候mysql挂掉,缓存页的数据没有同步到磁盘中就会发生数据丢失的情况,当缓存页的数据变更结束后,redo log会记录更改后的数据,然后磁盘根据redo log中的内容可以更改数据。这样事务执行失败的时候,就可以执行这个undo log日志里面的语句,回滚到事务执行之前的数据状态。redo log 的大小是固定的,前面的内容会被覆盖。原创 2023-02-17 15:20:12 · 641 阅读 · 0 评论 -
数据库连接池
为数据库建立一个池子,池子里面放了一定数量和mysql的连接,当需要建立数据库连接的时候,只需要从池子中取出一个连接,使用完,将这个连接放回到池子里(这个连接不会被销毁,等下次还需要建立数据库连接的时候再用)一次 SQL 请求就会和Mysql建立一个连接,多个请求就会建立多个连接,每一个数据库连接,使用完都要断开。现在最常用的数据库连接池是Druid连接池。频繁的创建和销毁连接会大大降低系统的性能。这样就避免了频繁的创建和销毁连接。原创 2023-02-17 10:54:50 · 95 阅读 · 0 评论 -
为什么使用B+树而不是使用二叉树,红黑树,哈希表作为索引
红黑树的树高还是太高了,比如当表里面有500w条记录 (也就是500w个索引),全部放到红黑树里面,树的高度会非常高,可能放完500w个索引,树的高度会达到20,所以可能要进行20次I/O操作,我们希望能够降低树的高度。显然,有了索引之后,只需要和磁盘做两次I/O即可,就可以找到key=89的结点,然后把这个结点的value值(磁盘中的文件地址)拿出来,去磁盘中的这个地址取出这行记录。只需要3次I/O即可。(3)B树没有冗余的重复的索引,B+树的非叶子节点和叶子节点有冗余的,重复的索引。原创 2023-02-14 14:47:20 · 402 阅读 · 0 评论 -
高度为3的B+树,最多可以放多少个索引字段
也就是说仅仅三层高的树 ,其叶子结点总共可以存储两千多万条记录。叶子结点特殊在不需要存储下一级结点的磁盘文件地址,也就是没有空白处 ,假设1个索引+data数据占1KB,则1个叶子结点最多存储16个索引字段。16KB/(8+6)=1170,所以1个结点最多存1170个索引。高度为3,叶子结点最多可以放1170*1170*16=两千多万。一棵高度为3的B+树,放满了,看看最多可以放多少个元素。step1:求出1个结点最多可以放多少个索引字段。空白处放的是下一级结点的磁盘文件地址 ,占6个字节。原创 2023-02-14 11:55:59 · 398 阅读 · 0 评论 -
SQL慢查询以及sql优化
long_query_time的默认值是10,即认为超过10秒的查询语句就认为是慢查询,但是实际中往往将这个值设置为1。这张表有一个索引,由city_id和third_cate_id(三级类目id)两个字段组成的联合索引。慢查询日志:会记录所有查询时间超过long_query_time秒或者无法使用索引的查询语句。比如这里查询条件用到的是字段是user_id,status,level,type。假设我们定义慢查询:查询时间超过100ms就是慢查询。加索引,加一个由查询条件里面的各个字段组成的索引。原创 2023-02-14 00:21:01 · 941 阅读 · 0 评论 -
数据库分库分表
用户基本信息表中存的是用户最主要的信息,比如用户名,密码,别名,手机号,邮箱,年龄,性别等核心数据,这些信息查询的频次非常高,用户扩展表中存的是用户的扩展信息,比如所属单位,户口所在地,所在城市等等,非核心数据,这些信息只有在特定的业务场景中才需要查询,绝大数业务场景中是不需要的(另一个分表原则是将调用频次高的放到一张表,调用频次低的放到另一张表中)当数据库的读,或者写的qps过高,导致数据库的连接不足了,这时候就要考虑做分库了,通过增加数据库的方式,来提供更多的可用数据库连接,从而提升系统的并发度。原创 2023-01-20 20:57:26 · 1707 阅读 · 0 评论 -
MySQL50题
都是score分数表,一张给它起别名叫表a,专门用来查01这门课程的分数,另一张给它起别名叫表b,专门用来查02这门课程的分。只用到一张表,成绩表Score,这张表里面有三个字段,s_id,c_id,s_score。1.学生表 Student(s_id,s_name,s_birth,s_sex)2.课程表Course(c_id,c_name,t_id)4.成绩表Score(s_id,c_id,s_score)3.教师表Teacher(t_id,t_name)创建学生表并且往表中插入语句。原创 2023-01-17 01:10:03 · 445 阅读 · 0 评论 -
mvcc 多版本并发控制(绝对通俗易懂,看不懂找我私聊给你讲明白)
MVCC具体实现是通过三个隐式字段+ undo日志+read view三个组件来实现的。multi-version concurrency control多版本并发控制。提高数据库并发性能,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。原创 2022-12-17 22:19:34 · 107 阅读 · 0 评论 -
快照读和当前读
当前读:insert,update,delete,以及Select.......for update(加排他锁的select语句)还有Select........ lock in share mode(加共享锁的select语句),执行这些语句进行数据读取的时候,就是当前读。快照读:普通的select查询语句就是快照读。原创 2022-12-17 19:38:54 · 331 阅读 · 0 评论 -
聚簇索引,非聚簇索引
聚簇索引的查询速度非常的快,因为整个 B+树本身就是一颗多叉平衡树,叶子节点也都是有序的,定位到索引的节点,就相当于定位到了数据。相比于非聚簇索引, 聚簇索引少了一次读取数据的 IO 操作(因为聚簇索引索引和数据放一块,而非聚簇索引不放一块,找到了索引还要单独去磁盘里读取数据,多了一次I/O操作): 如果对索引列的数据被修改时,那么对应的索引也将会被修改,而且聚簇索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的。:这应该是非聚簇索引最大的缺点了。原创 2022-12-17 15:11:14 · 1429 阅读 · 0 评论 -
MySQL锁 读锁和写锁,行级锁和表级锁
排他锁:事务在修改记录的时候获取这个排他锁,不允许多个事务同时获取这个排他锁,排他锁锁定的数据只允许获得锁的事务对它进行查询修改,其他未获得排他锁的事务无法对数据进行查询和修改。表级锁:mysql中粒度最大的锁,对整张表加锁,实现起来简单,资源消耗也比较少,不会出现死锁,但是由于其粒度太大,触发锁冲突的概率也是最大的,并发写的情况下性能非常差。行级锁:mysql中粒度最小的锁,只对当前操作的行记录(一行或者多行)进行加锁,大大减少了锁冲突的情况,但是加锁的开销也是最大的。表级锁针对非索引字段加锁,原创 2022-12-17 12:41:31 · 893 阅读 · 1 评论 -
读写分离和主从复制
从库复制主库的日志,然后解析日志,就知道在主库中具体执行的是什么样的sql,再把这个sql在从库中执行一遍,这样就可以做到从库中的数据跟主库中保持一致。然后有一个I/O线程负责读这个日志文件,然后将读到的内容拷贝到从库的中继日志(relay log)里面。此时又有一个sql线程负责读取中继日志中发生的事件,然后将她应用到从数据库中。这是只有一个数据库的情形,此时增删改查都是针对这个数据库而言。完成写操作后,把数据库中的数据要同步到从库中去,这就叫主从复制。这两个数据库,一个叫做主库,一个叫做从库。原创 2022-11-26 20:31:06 · 661 阅读 · 0 评论 -
Linux系统上安装软件
2.在虚拟机中的服务器终端中输入ifconfig(注意不是ipconfig,而是ifconfig),得到虚拟机的ip地址。3.用FileZilla将刚刚下载好的jdk文件上传到服务器的根目录下:即现在这个文件的文件路径是/XXXX.tar.gz。4.解压这个.tar.gz文件:解压到/usr/local这个文件夹里面去。1.去这个网站上下载linux版本的jdk。6.最后输入java -version表示正确安装好了jdk。安装jdk,安装tomcat,安装Mysql。原创 2022-11-22 23:51:11 · 304 阅读 · 0 评论 -
如何查看sqlyog的历史记录
这样就可以找到 可视化操作数据表 对应 的sql语句。工具里面可以找到历史记录。原创 2022-10-19 11:55:00 · 1660 阅读 · 0 评论 -
drop,truncate,delete
truncate table Student 表示将Student这张表里面的数据删除,但是这张表还是存在,只不过 把数据删除了,如果delete from Student,那跟truncate一样,清空表数据,而不是删除表。drop table Student 表示将Student这张表彻底删除。delete from Student where id=1 删除某一行。原创 2022-10-06 10:18:50 · 138 阅读 · 0 评论 -
IDEA连mysql
得到:填用户名和密码,得到:原创 2022-09-14 22:01:10 · 120 阅读 · 0 评论 -
索引的分类以及如何创建索引
主键索引(Primary Key):主键其实就是一个索引,主键不可以重复,而且只能一列作为主键。比如没有索引,你查询需要0.5秒,有了索引之后查询只需要0.0001秒。索引在小数据量的时候,有没有区别不大,大数据量的时候,区别很大。唯一索引(Unique Key):多个列都可以标识为唯一索引。,比如Ox1111,Ox2222,Ox8888.....帮助mysql高效快速获取数据。全文索引:FullText。原创 2022-09-14 16:41:14 · 1282 阅读 · 0 评论 -
事务的四大特性:ACID
一致性:以转账为例,没转帐前A,B加起来一共有1200元,不管你们两个人怎么转账,两个人的钱加起来永远还是1200。隔离性:多个事务同时在执行,事务与事务之间互不影响,即排除其他事务对本事务的影响。这里第一条sql语句和第二条sql语句就组成一个事务,要么都成功,要么都不成功。原子性:事务就是一组sql语句,这组sql语句要么都完成,要么都没完成。举个例子:银行转账能很好的描述清楚事务要么都成功,要么都不成功的性质。事务就是一组sql语句,这组sql语句要么都完成,要么都没完成。3.事务的自动提交机制。原创 2022-09-14 13:08:33 · 262 阅读 · 0 评论 -
sql聚合函数
count会忽略null值的意思是统计数目时不会把null算上。2.求总和,平均,最大,最小值。原创 2022-09-14 11:04:10 · 87 阅读 · 0 评论 -
排序,瀑布流和分页,子查询
以前是有页数的,但是现在你发现你根本拉不到底,你一直往下拉,就一直会加载出来新的图片,这就是瀑布流。这种嵌套使用select语句的写法都可以被内外连接的写法代替。order by ..... asc 按升序排列。order by ..... desc 按降序排列。limit a,b //表示从a开始显示b条数据。limit 0,5//表示从0开始显示5条数据。limit 1,5//表示从1开始显示5条数据。比如下面三个sql语句的写法就都是等价的。分页可以缓解数据库的压力。原创 2022-09-14 10:37:42 · 415 阅读 · 0 评论 -
常用mysql语句
like结合% 和_,其中%代表0到任意个字符,_代表一个字符。(1)查询出整张表: select * from 表名。(5)模糊查询:like 查找姓刘的同学。想把整张表删除:trancate 表吗名。(4)去重:select。2.upgrade 修改语句。原创 2022-09-13 22:36:59 · 157 阅读 · 0 评论 -
数据表中每一列的数据类型
2.字符串:varchar可变字符串是最常用的。3.时间日期 datetime是最常用的。1.数值:int是最常用的。数值,字符串,时间和日期。原创 2022-09-13 17:45:21 · 212 阅读 · 0 评论 -
安装mysql时候的一些坑
打开任务管理器,在详细信息或者服务里面,将mysql.exe服务结束才能完全删除之前安装的mysql文件夹。(1)建议先把之前的mysql先删除,在开始本次安装。显示:发生系统错误 2。系统找不到指定的文件。(2)安装后,要启动MySQL服务,输入。最后net start mysql。再mysqld install。先mysqld remove。原创 2022-09-13 01:15:35 · 718 阅读 · 0 评论 -
mysql可视化工具
最常见的就是这三个workbench,nacvicat,sqlyog。(1) Workbench - 免费、官方、有付费软件才有的重型功能。(2)Navicat-付费,有重型功能。(3)Sqlyog 付费。原创 2022-09-13 10:29:13 · 3951 阅读 · 0 评论 -
内连接和外连接
就是在上面的笛卡尔积中,只保存Persons.Id_P=Orders.Id_P的行(也就是红色四行)此时要保存的就是主表Orders中没有匹配到的行了(而不是Persons表中没有匹配到的行)Persons表和Orders表进行笛卡尔积得到:。Left Join=Left Outer Join 即左连接就是左外连接。内连接:等值连接,非等值连接,自连接。显然2,4号员工是从不订购的客户。内连接和外连接都是表的连接方式(3.外连接(左连接,右连接)外连接:左连接,右连接。...原创 2022-08-12 16:26:45 · 6234 阅读 · 2 评论