
sql
文章平均质量分 54
一只小小狗
大家好我是练习时长2年半的程序员
展开
-
SQL 实现表字段合并
select concat(字段1,字段2,…原创 2023-03-13 11:24:37 · 984 阅读 · 0 评论 -
一条 update 语句的生命经历
一条 SQL 语句在的执行,总的来说可以分为:Server 层和存储引擎层(InnoDB)负责跟客户端建立连接、账号密码验证、获取权限、维持和管理连接。在通过验证以后,分析器会对该语句分析,判断是否语法有错误等。选择索引,生成执行计划。根据优化器生成的执行计划,调用存储引擎 API 执行 SQL。读取数据页面进入 InnoDB 引擎层后,首先会判断该 SQL 涉及到的数据页是否存在于 BP(buffer pool)中;如果不存在则通过 B+Tree 读取到磁盘的数据页,然后加载到 BP:通过二分法查找原创 2022-07-06 19:49:41 · 128 阅读 · 0 评论 -
InnoDB ACID模型
主要与事务的 COMMIT 和 ROLLBACK有关(undo log 实现)(修改操作:记录修改后的记录会隐式的指向原来的数据行,当需要回滚操作的时候,会通过版本链的形式退回到原来的记录行)InnoDB 故障恢复(故障恢复比如:redo log日志的宕机恢复,bin log日志的主从数据一致性恢复)InnoDB 双写缓存(写入磁盘文件之前,会加入双写缓存中,双写缓存保证了存入物理磁盘的一致性,当发生错误的时候,会选择是否丢弃该缓冲页或者回复表空间文件)隔离级别InnoDB 锁机制Mysql内原创 2022-07-06 10:24:53 · 142 阅读 · 0 评论 -
说一说MVCC多版本并发控制器?
MVCC是一种多版本并发控制器,一般使用于对数据库并发访问。MVCC是不使用锁来控制事务,并且可以解决脏读、不可重复度、幻读。(无法解决更新丢失问题。)Innodb每行数据都有向上指向的一个版本数据存放在undo log中,形成一个版本链。如果进行更新记录,则会将最新的数据写入undo log中,并且隐藏指针指向上一个版本。此时查询就会查询到最后一个undo log版本。MVCC好处:读不加锁、读写不冲突,增加了并发,保证了事务。如有错误欢迎指正...原创 2022-07-05 22:06:47 · 315 阅读 · 0 评论 -
MySQL InnoDB架构原理
InnoDB主要分为:在内存中结构 和 在磁盘上结构内存结构主要为: Buffer Pool (change Buffer 、adaptive hash index) log buffer磁盘结构分为:表空间和重做日志表空间:InnoDB数据字典、双写缓存区、修改缓存、Undo日志。重做日志:存储的就是Log buffer刷到磁盘的数据。(.idb、.frm、undo.log、(双写缓冲区(doublewrite buffer),故障恢复机制(crash recovery))、锁机制、Redo.lo原创 2022-07-05 16:02:31 · 448 阅读 · 0 评论 -
MySQL数据库主从同步,一致性解决方案
介于异步复制和同步复制之间,主库在执行完客户端提交的事务后不会立即返回给客户端,而是至少要等到一个从库接收并写到redo log中,才会返回给客户端,相对于异步复制,半同步复制提高了数据的安全性如有错误欢迎指正...原创 2022-06-27 18:11:08 · 1771 阅读 · 0 评论 -
MySQL主从同步之 异步复制 半同步复制 全同步复制
为了解决主从同步不一致的问题主库执行完提交事务后,立刻异步执行将结果返给给客户端,并不关心从库是否收到并处理。如果出现从库并未收到处理的情况,还是会有主从数据不一致的问题。期MySQL(5.5以前)仅仅支持异步复制。并且早期支持 myisam引擎。主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到 relay log 中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟。半同步复制的出现,就是为了保证在任何时刻主备数据一致的问题。相原创 2022-06-27 17:20:48 · 2210 阅读 · 0 评论 -
MySQL 主从复制原理以及流程
保证主服务器(Master)和从(备Slave)的数据一致性,想Master进行数据修改后,(在一定规则下)Slave会将Master中数据同步过来。当Master节点宕机时,可以指定一台Slave充当Master,(当对Master进行数据操作时进行宕机,可能会导致Slave机数据不一致)可以进行读写分离,比如Master主要用作写入操作,而读取操作交给Slave,由于查询的需求更大,使用多个备用服务器进行读取。针对不同的业务场景进行数据库的索引创建和根据业务选择MySQL存储引擎, 不同的slave可以原创 2022-06-27 14:02:21 · 572 阅读 · 0 评论 -
mysql-索引对数据库性能影响-(大量无脑增加索引)
如有错误欢迎指正原创 2022-06-18 20:33:45 · 810 阅读 · 0 评论 -
MyISAM与InnoDB 的区别
如有错误欢迎指正原创 2022-06-18 20:26:26 · 2434 阅读 · 0 评论 -
分库分表拆分后解决唯一性主键问题
简单、性能好、无序,无法存在业务含义,但是会有MAC地址泄露风险。简单实现、单调递增,具有一定的业务刻度性、强依赖db、有暴露业务信息的风险。可以很好的做唯一性,但是增加了系统复杂度和稳定性。雪花算法是Twitter公司发明的一种算法,主要目的是解决在分布式环境下,ID怎样生成的问题1,分布式ID生成规则硬性要求:全局唯一:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。趋势递增:MySQL中InnoDB引擎使用的是聚集索引。多数RDBMS使用Btree的数据结构来存储索引数据,在主键的选择上尽量选原创 2022-06-17 19:43:32 · 532 阅读 · 0 评论 -
Mysql索引失效
这个和非聚餐索引联合索引的索引存储结构有关。比如手机号是字符串,但是你写成了number int等,做了隐式的转换select * from user_info where mobile = xxx;当需要查询的范围已经很大了,全表扫描会更高效。全表扫描可以顺序读取磁盘,一次读一大块。索引很可能只能随机读取磁盘,一次读一条。如有错误欢迎指正...原创 2022-06-17 19:20:30 · 149 阅读 · 0 评论 -
Mysql中锁的类型有哪些?
粒度大、加锁简单、容易冲突粒度小,加锁比表锁困难,不易冲突,支持更高的并发粒度更小,加锁更困难,不易冲突,支持更高的并发。当加了这样一个状态,就相当于,告诉其他事务,我已经对整个表进行了共享锁会这我排他锁。避免了对整个索引的每个节点扫描是否加锁,而这个状态就是意向锁。如有错误欢迎指正...原创 2022-06-12 19:01:03 · 3897 阅读 · 3 评论 -
B树和B+树的区别,为什么Mysql使用B+树?
因为索引是用来加快查询的,而B+树通过对数据进行排序可以提高查询速度,B+tree通过一个节点可以存储跟多的元素,使得B+树更加矮胖,所需要的IO更少,并且一页只有16KB,一般情况下任务深度为3的B+tree可以存2000万行数据。利用B+树中的叶子节点有序链表可以很好地支持范围查找和全表扫描。如有错误欢迎指正...原创 2022-06-12 17:29:27 · 482 阅读 · 0 评论 -
为什么联合索引是最左匹配原则?(最左前缀原则)
我们工作中业务更多使用的是一个联合索引。联合索引的最左匹配原则是受到,联合索引的结构影响,比如一个B+tree的联合索引他结构大致为这样这里联合索引中第一个索引字段为name,age,…在存储联合索引的时候也是首先将name作为一个排序条件,然后再age作为排序条件,依次排序。当想使用联合索引的时候,最左端的字段不存在,叶子节点就无法进行第一步索引定位,索引自然直失效了。如有错误欢迎指正......原创 2022-06-11 20:09:53 · 1587 阅读 · 0 评论 -
innoDB为什么必须要有主键,为什么推荐使用自增整型的主键?
如果主键为 UUID整型容易比较大小进行排序,B+tree中的叶子节点和非叶子节点同层中都是从左到右有序递增的。mysql为了维护索引的有序性,使得新增的主键会在B+tree叶子节点中最后末尾添加,使得树分叉概率变小。如有错误欢迎指正...原创 2022-06-11 18:57:24 · 629 阅读 · 0 评论 -
Mysql中创建4种索引的不同方式
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。这条语句创建索引的值必须是唯一的,索引值可以为null(null可重复出现)添加普通索引,索引值可出现多次。该语句指定了索引为 FULLTEXT ,用于全文索引。三、使用 Create 创建索引语法:如有错误欢迎指正...原创 2022-06-10 16:57:23 · 431 阅读 · 1 评论 -
Mysql 什么是聚集索引和非聚集索引?
就是基于,在InnoDB的引擎里,一张表的数据对应的物理文件本身就是按照B+Tree来组织的,聚集索引就是按照每张表的增加来构建的这样一个B+树。叶子节点会存储这个表里的每一行数据记录。聚集索引并不是仅仅是一种索引类型,还代表的一种数据存储方式。并且表必须有一个主键,如果没有主键InnoDB会默认选择一个隐藏列,作为主键索引来存储表的数据,一般情况是建议自增id作为主键。有连续性的在磁盘下入性能和检索性能上都会很高。如果使用uuid这种随机id的话,频繁插入会导致磁盘随机io,从而性能下降。并且一个表只能原创 2022-06-10 16:40:33 · 1666 阅读 · 0 评论 -
Mysql的回表查询?如何避免?
使用普通索引的情况下,并且包含了非索引字段的时候,会通过该普通索引获取到叶子节点的主键信息,拿到主键信息后再去聚合索引中找到对应的行信息,这个过程就叫做回表查询。如有错误欢迎指正......原创 2022-06-10 15:37:12 · 2000 阅读 · 0 评论 -
慢查询如何优化?(实战慢查询)
windows中是 my.ini 文件linux和MacOs中是 my.cnf 文件开启慢查询日志5.5以上版本直接分析慢查询日志,mysql使用 + sql语句进行模拟优化器来执行分析。oracle使用 + sql语句进行模拟优化器来执行分析。table | type | possible_keys | key |key_len | ref | rows | Extra EXPLAIN列的解释:table 显示这一行的数据是关于哪张表的type原创 2022-06-09 14:36:44 · 8412 阅读 · 2 评论 -
sql查询 找出重复数据,并且只保留一条.
1.(错误操作)查所有的重复数据很明显下列代码运行速度很慢select * from 表 t where (select count(*) from 表 where 字段1=t.字段1 AND 字段2=t.字段2)>1 所以我们使用下面的分组1.(速度优化) 查所有的重复数据SELECT * FROM 表 WHERE (字段1, 字段2, 字段3) IN (SELECT 字段1, 字段2, 字段3 FROM 表GROUP BY 字段1, 字段2, 字段3 HAVING COUNT(*原创 2022-04-14 18:10:35 · 27311 阅读 · 5 评论 -
MySQL外键设置cascade、set null、restrict、no action
(1)cascade:级联,当父表更新、删除,子表会同步更新和删除(2)set null:置空,当父表更新、删除的时候,字表会把外键字段变为null,所以这个时候设计表的时候该字段要允许为null,否则会出错(3)restrict:父表在删除和更新记录的时候,要在子表中检查是否有有关该父表要更新和删除的记录,如果有,则不允许删除个更改(4)no action:和restrict一样...原创 2020-12-18 20:05:15 · 698 阅读 · 1 评论 -
谈一谈事务隔离级别
隔离性READ UNCOMMITTED 读未提交,脏读、不可重复读、幻读有可能发生。READ COMMITTED 读已提交,可避免脏读的发生、但不可重复读、但幻读有可能。REPEATABLE READ 可重复读,可避免脏读,不可重复读的发生,但幻读有可能发生。SERIALIZABLE 串行化,可避免脏读、不可重复度、幻读的发生、但性能影响大。而Oracle和MySQL主要使用 读已提交 和 可重复读...原创 2020-11-13 14:48:56 · 92 阅读 · 0 评论 -
谈一谈事务的特点
谈一谈事务的特点原子性是基础,隔离是手段,一致性是约束条件,而持久性是我们的目的。简称:ACID原子性、一致性、隔离性、持久性原子性:事务在数据库的逻辑工作单位,要么都完成,要么都不完成。一致性在事务操作前后必须满足业务规则约束,比如:A有1000元,A不能取出1001元。隔离性事务之间互不干扰,并发执行的各个事务之间不能互相干扰。(主要还是看隔离级别的设置)持久性事务一旦提交了,结果就是永久性的,即便发生宕机,仍可以通过日志完成数据的持久化。日志包括回滚日志,和重做日志...原创 2020-11-13 14:37:12 · 140 阅读 · 0 评论 -
如何解决SQL注入?
如何解决SQL注入?一.什么是sql注入SQL注入是一种网络攻击方式,是程序猿编写疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。二.如何实现SQL注入攻击寻找SQL注入位置判断服务器类型和数据库类型针对不同的服务器数据库特点进行SQL注入攻击。三.攻击实例String sql = select * from user_tablewhere username='"username"' and password = '"password"';这样输入之后 就相当于 1 =原创 2020-11-11 21:44:30 · 334 阅读 · 0 评论 -
SQL左连接,右连接,内连接简单例子
SQL左连接,右连接,内连接简单例子左连接:以左表为主select column_a , column_b from table_a left join table_b on table_a.id=table_b.id;右连接:以右表为主select *from table_a right join table_bon table_a.id = table_b.id;内连接:值查询两张表符合的记录select *from table_a inner join table_bon原创 2020-11-11 21:29:11 · 580 阅读 · 0 评论 -
谈谈你对数据库三大范式及反范式的理解
范式第一范式(1NF)一个列表的值不能再分割。例如,假设表中有一个列表示用户的爱好这个列的值可是:足球 篮球 乒乓球但是这个值是可以再分割的,分成三个值,分为:足球、篮球、乒乓球第二范式(2NF)表中非主键列都必须依赖于主键列例如,订单表中有订单编号,并且该列是主键列注意,这几个非主键列中,产品生产地是不依赖于订单编号的,所以这个列不应该出现在订单表中第三范式(3NF)直接依赖于主键列,不能间接依赖于,不能依赖传递例如,订单表中有订单编号,并且该列是主键注意,顾客编号依赖于原创 2020-11-04 16:49:30 · 300 阅读 · 0 评论 -
oracle中sql查询
oracle中sql查询一、查询别名拼接nvl替换null值distinct数据去重修改列宽(控制sqlplus)2.排序order by3.查询条件where3.函数单行函数聚合函数转换函数哑表dual日期函数4. 多表查询笛卡尔积等值连接不等值连接外连接(左外连接、右外连接、全连接)自连接查询结果集操作union 并集union all 结果集一起显示minus 第一个结果集出去第二个结果集相同的部分intersect 去交集5.聚合函数group by一、查询别名 列名 别名原创 2020-11-04 16:37:53 · 656 阅读 · 0 评论