![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
sql数据库学习
文章平均质量分 68
explore翔
安徽某985小硕,记录日常学习生活,欢迎大家交流指教。
展开
-
SQL数据库的整体结构、索引、MVCC、锁、日志、查询优化,三大范式等
2、聚簇索引在增删改的时候比非聚簇索引慢很多,因为插入新数据时需要检测主键是否重复,这需要遍历主索引的所有叶节点,而非聚簇索引的叶节点保存的是数据地址,占用空间少,因此分布集中,查询的时候I/O更少,聚簇索引的主索引中存储的是数据本身,数据占用空间大,分布范围更大,可能占用好多的扇区,因此需要更多次I/O才能遍历完成。,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。原创 2023-05-31 09:40:02 · 1431 阅读 · 0 评论 -
数据库如何分库分表
来分,每个库一段连续的数据,这个一般是按比如时间范围来的,但是这种一般较少用,因为很容易产生热点问题,大量的流量都打在最新的数据上了,优点:扩容的时候,就很容易,因为你只要预备好,给每个月都准备一个库就可以了,到了一个新的月份的时候,自然而然,就会写新的库了 缺点:大部分的 请求,都是访问最新的数据。如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从),,按业务不同,业务放到不同机器上。原创 2023-02-17 15:07:20 · 721 阅读 · 0 评论 -
数据库主从复制和读写分离
写请求多记录一个key(可以加主键),读请求,如果此时 key 存在,将会路由到主库,一定时间后(经验值),中间件认为主从同步完成,删除这个 key,后续读将会读从库.只在从数据库读) 在数据库读多写少时可以用,多个slave可以减轻读的压力,且写操作在主数据库不影响读。,即解析成 sql 语句逐一执行,使得其数据和 Master节点的保持一致,最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,Master的二进制事件。原创 2023-02-17 14:34:59 · 287 阅读 · 0 评论 -
SQL之缓存池
在 MySQL 启动的时候,InnoDB 会为 Buffer Pool 申请一片连续的内存空间,然后按照默认的16KB的大小划分出一个个的页, Buffer Pool 中的页就叫做缓存页。设计 Buffer Pool 除了能提高读性能,还能提高写性能,也就是更新数据的时候,不需要每次都要写入磁盘,而是将 Buffer Pool 对应的缓存页标记为脏页,然后再由后台线程将脏页写入到磁盘。当修改数据时,首先是修改 Buffer Pool 中数据所在的页,然后将其页设置为脏页,最后由后台线程将脏页写入到磁盘。原创 2023-02-08 11:07:33 · 508 阅读 · 0 评论 -
SQL之数据库连接
所以针对于此,所有的数据库供应商和工具开发商都认为,如果Java能够为SQL访问提供一套“纯”JavaAPI,同时提供一个驱动器管理器来允许第三方驱动程序可以连接到特定的数据库,如此一来数据库供应商可以提供自己的驱动器程序来插入注册到驱动器管理器中;4、接下来就是标准流程:注册驱动-获取数据库连接对象-定义sql语句-获取执行SQL语句的对象 Statement-执行SQL,接收返回的结果,处理返回结果-释放资源。总之,JDBC实现了以下目标:通过使用标准的SQL语句,甚至是专门的SQL扩展,原创 2022-11-07 14:44:24 · 3704 阅读 · 0 评论 -
SQL之游标
其实在Oracle中,每当我们有增删改操作(可以回滚的操作),就会声明一个隐式游标,相当于在内存中暂存结果,只要不提交,就可以回滚,底层数据库不受影响,不过在MYSQL中好像是用Log来记录变化,提交就写回到数据库中。(对于游标加锁这一点我是怀疑的,因为游标是READ_ONLY的,不能修改临时表或底层的数据,你影响不了别人,并且如果是静态游标,别人对底层数据改变也影响不了你。取出数据中,一开始游标位置相当于数据的-1处,如果是NEXT,那么就取出-1的下一条数据,也就是第一条数据,数组坐标是0。原创 2022-11-04 15:53:41 · 1430 阅读 · 0 评论 -
SQL之索引
2、聚簇索引在增删改的时候比非聚簇索引慢很多,因为插入新数据时需要检测主键是否重复,这需要遍历主索引的所有叶节点,而非聚簇索引的叶节点保存的是数据地址,占用空间少,因此分布集中,查询的时候I/O更少,聚簇索引的主索引中存储的是数据本身,数据占用空间大,分布范围更大,可能占用好多的扇区,因此需要更多次I/O才能遍历完成。3、另外,最好采用自增的主键,1,2,3,4,5…首先明确,二者都是B+树结构的,区别在于,聚集索引的叶子结点数据域存储的是那一行数据本身,非聚集索引叶子结点的数据域存储的是那行数据的地址。原创 2022-11-03 17:53:46 · 597 阅读 · 0 评论 -
SQL之事务处理
3 Repeatable read(可重复读取):可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的,因此称为是可重复读隔离级别。隔离性:不同并发事务之间是独立的,不依赖的,比如一个事务X修改数据,而其他事务Y需要使用这些数据,那么X可以在Y完成之前或之后进行,不会在中间状态进行。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。原创 2022-11-02 17:31:29 · 711 阅读 · 0 评论 -
SQL之存储过程和触发器
当需要用时,直接调用存储过程就可以,不需要再写复杂的SQL语句。另外,如果某些表名,列名,逻辑发生变化,只需要管理员修改存储过程的内容即可,每个使用它的人不需要做出改变。安全:封装存储过程后,只需要调用存储过程,大家都一样,犯错的概率低。参数问题,存储过程参数有三种类型,IN代表传入的参数,可以是常量或变量,OUT是返回参数,只能是变量。并且节省应用程序和数据库服务器之间的流量,因为不需要复杂的语句,只需要过程名和参数即可。第二,编写复杂逻辑的存储过程需要丰富经验,如果没写好,调试很困难,后期维护也难。原创 2022-11-01 16:37:53 · 1138 阅读 · 1 评论 -
SQL之视图的使用
这个不好说,如果是一个表的视图可能可以修改,多个表联结的视图不行,如果视图中包含函数等操作不行,这些规定每种数据库系统都不一致。因为修改的话,就涉及到数据会重写到真正的表中,这种行为是危险的。因为视图和底层表是分开的,所以系统可以给不同用户不同的视图,也就是说不同员工权限不一样,那么能看到的数据就不一样,符合现实需求。再比如如果经常需要某种特定格式的数据返回,就可以先创建这种视图,以后直接用这种视图查询就行。视图是一张虚拟的表,是一个表的部分或者几个联结表的部分。上面说的都是查询,那么视图是否可以修改呢?原创 2022-10-31 16:44:11 · 1460 阅读 · 0 评论 -
SQL之增删查改操作
INSERT还可以用来将SELECT语句的结果插入表中,比如我们想将table2的数据插入到table1中,前提是这两个表的列结构要相同。NULL是默认的,如果要把一个列当主键,那么必须指定这列NOT NULL,主键不允许有空值。如果想要删除所有信息,用truncate table 表名更快,因为它不扫描表,不记录数据变动。表的更新和UPDATE更新不同,ALTER更新的是表的结构,比如增加删除列,增加删除约束,键等。使用ALTER应小心,表的修改是不能撤销的,比如数据丢失等情况会发生。原创 2022-10-26 16:30:05 · 1897 阅读 · 0 评论 -
SQL之连接表
没有where条件,第一个表的每一行将与第二个表每一行配对,称为笛卡尔积,也就是说,表1有M行,表2有N行,最终结果为M*N行,这显然不符合我们的预期。假设我们有一个产品信息表,主要包括产品ID,供应商ID,价格等信息,还有一个供应商表,主要包括供应商ID,供应商地址,联系方式等。而where条件是隐含在语义中的,我们要查询一件产品的名字及其供应商名字,而两个表公有的属性是供应商的ID,因此需要通过这个来配对,不需要别的供应商的名字。但是,表别名只用于查询,不返回客户端,这和列别名有区别,原创 2022-10-21 10:08:11 · 259 阅读 · 0 评论 -
SQL之聚集函数和数据分组
以上我们可以对所有数据进行匹配或对where子句指定的行进行匹配,但是,如果我们需要对某列进行分组,以每一组的形式返回数据怎么办呢,就需要用到group by ,having将数据分成多个逻辑组,对每个逻辑组进行聚集计算。比如,我们需要从上面的分组中过滤掉选课数目少于5门的同学,则需要用到HAVING,为什么不能用where来过滤呢,因为这里的课程数目是基于分组的聚集值,而where是针对行的,不能完成任务。现实需求中,我们经常需要返回的是找出某一列的最大值、最小值、平均值、总和、行数等。原创 2022-10-14 10:00:45 · 908 阅读 · 0 评论 -
SQL必知必会-where过滤操作
用来否定其后跟随的任何条件,相当于不等于,但是比不等于更好用,因为他可以和其他操作符联合使用,比如WHERE NOT name IN (‘ddd’,‘CCC’,‘AAA’);当我们需要基于某种模式进行匹配怎么办,比如匹配名字中包含’a’的所有的行。通配符很强大,但是搜索代价也很大,特别是用在搜索模式的开始处,所以有明确过滤条件尽量明确,不要过度使用通配符。(找出价格为空值的列,这种缺失的数据需要引起我们的注意)同时,我们还可以使用AND OR来组合不同的过滤条件,满足更复杂的需求。原创 2022-10-11 09:36:00 · 712 阅读 · 0 评论 -
SQL必知必会-select部分
如果按姓氏降序排序,姓氏相同再按名字升序排序;注意,DISTINCT作用于后面所有的列,当作用于多个列时,取的是拼接后不同的字段;如果想要按多个列排序,比如先按照姓氏升序排序,姓氏相同再按名字升序排序;代表按列的升序排列,ASC可以忽略,因为默认升序。多行注释: /* */ ,跟C++一样。ORDER BY 姓氏 DESC,名字。select从表中查询某一列;查询某一列的从第五行起的后五行。ORDER BY 姓氏,名字。select 姓氏,名字。select 姓氏,名字。查询某一列的不同的值;原创 2022-10-10 10:06:36 · 387 阅读 · 0 评论