MySQL
文章平均质量分 69
爱叨叨的程序狗
码农,不只Coding.
展开
-
利用Spring Boot实现MySQL 8.0和MyBatis-Plus的JSON查询
在现代的Web开发中,处理JSON数据已经变得无处不在,而在关系型数据库中高效地查询JSON结构变得愈发重要。MySQL 8.0结合MyBatis-Plus和Spring Boot,为管理和查询JSON数据提供了强大的工具。在本文中,我们将探讨两种使用MySQL 8.0和MyBatis-Plus在Spring Boot应用中查询JSON数据的方法。原创 2024-03-04 20:31:34 · 1982 阅读 · 0 评论 -
优化MyBatis查询条件:从Boolean类型判断到<choose>标签的进化
作为一名程序员,我们的代码首先要保证功能可用,在功能可用的前提下,要保证代码质量可读性、安全、性能等。吾日三省吾身,多思考一下代码如何能写的更好,这要求我们需要不断探索代码的最佳实践。保持持续学习的态度,每天优化一点点,一点点改进,从而写出更加优雅、高效和安全的代码。原创 2024-02-19 11:52:06 · 757 阅读 · 0 评论 -
SUM函数在SQL中的值处理原则
的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。函数时,对于字段中的NULL值,需要特别注意其处理原则,以确保计算结果的准确性。🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。如果SUM函数作用的字段在所有匹配的记录中存在任意一条数据不为。函数是用于计算指定字段的总和的聚合函数。值替换为特定的默认值,从而更好地控制计算的行为。函数作用的字段在所有匹配的记录中均为。在实际应用中,确保对字段的。原创 2023-12-07 08:45:00 · 848 阅读 · 0 评论 -
MySQL find_in_set函数的深入解析与应用
是MySQL中的一个字符串函数,用于搜索一个字符串在另一个逗号分隔的字符串列表中的位置。如果找到匹配,它返回一个大于0的整数表示位置,否则返回0。其中,str是要查找的字符串,strlist是逗号分隔的字符串列表。原创 2023-12-04 12:04:36 · 1126 阅读 · 0 评论 -
数据库设计范式
数据库设计是构建可靠和高效系统的关键步骤之一。设计范式是一种规范,它帮助开发人员减少数据冗余、提高数据一致性和完整性。本文将探讨数据库设计范式的重要性,并通过基于MySQL的表设计示例来佐证其应用。原创 2023-11-30 20:33:43 · 951 阅读 · 0 评论 -
基于SpringBoot实现MySQL与Redis的数据一致性
一致性的解决方案可以使用“先写MySQL,再删除Redis”策略,这种方案在极限条件下有不一致的可能性,但结合需求和技术实现可以综合评判。采用“先写MySQL,通过MySQL的Binlog特性,异步写入Redis”。综上所述,Cache Aside方案适用于读取频率较高、对数据实时性要求不高的场景,通过合理地使用缓存来提高系统性能和扩展性,并通过维护数据的一致性来避免数据不一致的问题。我已将canal实现数据同步代码开源,请自行下载领取,笔者不介意您宝贵的Star,如果能帮到您,十分荣幸。原创 2023-08-27 16:43:41 · 812 阅读 · 0 评论 -
优化查询性能:UNION与UNION ALL的区别
在实际应用中,我们应该根据查询的需求和性能要求,谨慎选择合适的操作符,以提高查询效率。最后,值得注意的是,优化查询性能是一个复杂的过程,还涉及到其他因素,如索引的设计、统计信息的准确性以及查询语句的编写等。通过选择适当的操作符和实施综合的优化措施,我们可以提高数据库查询的效率,提升应用性能,为用户提供更好的体验。在SQL查询中,当我们需要合并多个查询结果集时,我们通常会使用UNION和UNION ALL操作符,同时,如果你写的or语句不走索引,可以考虑使用UNION、UNION ALL优化。原创 2023-08-14 15:34:36 · 1011 阅读 · 0 评论 -
MySQL不走索引的情况分析
innodb表的统计信息并不是实时统计更新,如果统计信息和实际的索引信息差异很大,就会导致优化器计算各个索引成本后,做出非预期的选择。出现这种现象的场景是:当有大量数据在短时间内落库时,Innodb还没更新统计相关信息,此时来了一个查询,MySQL会基于历史数据做出错误的判断:当前表数据量少,不走索引更高效。回表操作可能会增加额外的磁盘访问和数据检索的开销,因此,在某些情况下,当MySQL判断回表所需的资源大于直接扫描全表时,它可能选择不走索引,而是执行全表扫描。查询频繁是数据表字段增加合适的索引。原创 2023-08-11 22:42:22 · 1186 阅读 · 0 评论 -
百万数据分页查询优化方案
分页列表查询是项目中的热点需求,这种需求的特点是:字段多、数据量大、访问频繁、使用率高的特点,这个功能是给用户最直观的展示系统的信息,针对于多、大、频、热这几个特点,会引申出一个问题:列表展示的数据可能是来自于不同的数据维度、需要关联N张表查询得到,那么,如何让用户更快、更准的获取到需要的数据,便成了程序员在编码时需要考虑到并且需要解决的问题,因为随时间推移,线上系统不乏几百万数据的表。实际的业务场景下,可能会关联N张表,而且线上服务器的压力会比单机开发环境更重,因此实际接口响应时间会更长。原创 2023-07-26 08:38:56 · 411 阅读 · 0 评论 -
MySQL--什么情况下不建议使用join查询
当需要查询两个表的交集、并集等数据时,除了嵌套子查询的方式外,还可以使用join的方式提升性能。对于MySQL的join语句,需要两个最基础的“角色”:主表即驱动表,关联表即驱动表。当被驱动表无可用索引时,在驱动表得到一行数据后,需要拿着该数据去被驱动表扫描全表逐行匹配数据,假设驱动表有N行数据,被驱动表有M行数据,那么扫描总行数则为:N*M行。如果驱动表与被驱动表均有十万行数据,则需要扫描100亿行。在本策略中,驱动表在where条件筛选完毕后,会扫描全表,被驱动表走索引的树搜索。原创 2023-01-10 15:36:27 · 497 阅读 · 0 评论 -
MySQL隐式转换
由于表数据量较少,共3行,所以两者在执行时间上相差无几,但是在数据量较大的表中,扫全表和使用主键索引的性能差距还是相距甚远的。CONVERT() 函数,在这里的意思是把输入的字符串转成 utf8mb4 字符集。使用explain查询执行计划,扫描行数是1,即使用了主键索引。当两个表的字符集不同时,关联查询时会导致被驱动表无法命中索引。使用explain查询执行计划,扫描行数是3,即全表数据。类型,但是在第一个查询语句中,where条件中1为。官方给的定义些许抽象,下面看例子。最后,祝大家2023新年快乐。原创 2023-01-01 16:21:46 · 1013 阅读 · 0 评论 -
MySQL order by的不同排序规则
explain语句执行的结果中,Extra项中含有表示需要排序,MySQL会给每个线程分配一块内存用于排序,称为sort_buffer。原创 2022-12-25 10:48:09 · 832 阅读 · 0 评论 -
重建表实现数据库空间回收
需要补充说明的是,上述的这些重建方法都会扫描原表数据和构建临时文件。对于很大的表来说,这个操作是很消耗 IO 和 CPU 资源的。如果使用delete命令把整个表的数据删除,所有数据页标记为“可复用”,但磁盘文件的大小不会变。删除原行数据后,如果新插入的值在原数据行相邻两个行之间,可能会复用该位置。经过大量增删改的表,都可能是存在空洞的,重建表就能达到这样的目的。表数据既可以存储在共享表空间里,也可以存储在单独的文件中,时,表数据在系统共享表空间,也就是跟数据字典放在一起。包含两部分,即表结构定义和数据。原创 2022-12-17 17:07:24 · 187 阅读 · 0 评论 -
MySQL抖动-为什么偶现突然变慢的问题?
这时候只能把最久不使用的数据页从内存中淘汰掉,如果要淘汰一个干净页,就直接释放出来复用,但是脏数据页就必须将脏页先刷到磁盘,变成干净页后才能复用。会在Redo log内存被写完时以及服务器系统内存不足,亦或是负载较低时,会使用flush刷盘操作,把内存里的数据写入磁盘。语句,正常执行的时候特别快,但是有时变得特别慢,并且这样的场景很难复现,它不只随机,而且支持时间还很短。在执行更新语句时,在更新内存写完redo log后,就返回给客户端,本次更新完成,出现抖动时,可能就是在刷脏页。所以,InnoDB 有。原创 2022-12-15 21:27:38 · 577 阅读 · 0 评论 -
MySQL字符串索引创建方案
因此,我们可以通过统计索引上有多少个不同的值来判断要使用多长的前缀。是支持前缀索引的,也就是说,你可以定义字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前端长度,那么索引就会包含整个字符串。创建前缀索引前,需要预定可接受的损失比例,使用Ln/总区分度计算损失比例,选择可达到最小损失比例的前缀长度即可。当使用全字段索引时,根据索引树查到符合where条件的id,根据id去查询数据所在的行即可,无需再判断。可以看到,当使用前缀索引时,扫描行数为3,当使用字段索引时,扫描行数为1。原创 2022-12-12 19:26:12 · 585 阅读 · 0 评论 -
MySQL执行计划误选索引及修改方案
查看该语句,where条件中a需要扫描1000行,b要扫描50000行,由于两者是and条件连接,所以我们认为使用索引a可以扫描更少的行数,因此,在查询时优化器会使用到a索引,但是使用explain执行时,可以看到explain命中了b索引,扫描了50128行。当某个字段需要排序的时候,那么同等条件下,会优先考虑使用排序的那个字段索引,因为直接使用排序字段做索引,查询的结果就是已经排好序的,无需再次排序。,由于索引有排序的功能,优化器认为使用b索引可以避免再次排序,所以使用了索引b。MySQL中可以使用。原创 2022-12-10 11:31:43 · 1042 阅读 · 0 评论 -
MySQL普通索引和唯一索引的选择
假设你的项目中主要负责车辆管理系统,每辆车的车牌号在系统上唯一,在新增车辆时,业务层面会先判断待新增的车辆车牌号是否已存在系统中,产品功能中使用频率最高的是根据车牌号查询车辆信息,由于业务量和数据量的增加,现在需要考虑在车辆表车牌号字段增加索引,现有两种索引可供选择:唯一索引、普通索引。接下来分析两种索引哪个更适合于当前业务。当用户使用车牌号查询车辆信息时,执行SQL如下:普通索引假设现已在字段创建普通索引,那么InnoDB中执行的逻辑为:命中唯一索引,从yB+树的树根节点开始,查询到为’鲁B 12原创 2022-12-07 20:59:04 · 465 阅读 · 0 评论 -
MySQL-MVCC多版本控制及事务的隔离性
MySQL的InnoDB引擎具有不同的事务隔离级别,不同事务隔离级别通过视图创建时机的不同来实现。MVCC:Multiversion concurrency control,即多版本控制,在并发访问数据库时,通过对数据做多版本管理,也就是为每条记录保存多份历史数据供读事务访问,新的写入只需要添加新的版本即可,无需等待。避免因为写数据时要加写锁而阻塞读取数据的请求,实现读取数据不用加锁,读取数据同时修改。修改数据同时可读取。多版本指的是数据表中同一个行数据可能会有多个版本(row),每次事务更新数据的时候,都原创 2022-12-03 21:59:01 · 496 阅读 · 0 评论 -
MySQL之索引
索引是一种数据结构,是对记录集的一个或多个字段的值进行排序的存储结构。数据库索引是一种提高表操作速度的数据结构。可以使用一列或多列创建索引,为快速随机查找和有效排序记录访问提供基础。原创 2022-11-23 21:45:14 · 485 阅读 · 0 评论 -
常见索引类型及在MySQL中的应用
索引是一种数据结构,是对记录集的一个或多个字段的值进行排序的存储结构。索引的出现其实是为了提高数据查询的效率,就像书的目录一样,根据目录可以快速定位到内容,类比于索引,根据索引提供指向存储在表的指定列中的数据值的指针,根据指针找到包含该值的行。哈希表模型是将待查询的值放入key中,value值放入数组中,当使用哈希表时,key值计算成确定位置,将value值放入该地址对应的哈希槽,取值通过key值去对应哈希槽取数据,但经过哈希后的key可能会出现数据重复一致(哈希冲突)的情况,此时哈希槽中的值是一个列表,使原创 2022-11-09 18:33:32 · 563 阅读 · 0 评论 -
MySQL事务隔离级别
一个事务在执行过程中查询到的数据,总是与该事务启动时看到的数据是一致的。读未提交是一个事务仅修改了数据但还未提交时,本次修改可以便可被其他事务查询到变更后的值。读未提交隔离级别下,其他事务进行查询时,直接返回记录上的最新值,没有视图概念。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。在三次查询过程中,第一次查询到的数据是name1,第二次查询到的数据是name1,A事务提交后,查询到的数据是name2;一个事务修改了数据且成功提交事务后,才可查询到更新后的数据。原创 2022-11-08 21:16:33 · 385 阅读 · 0 评论 -
MySQL关联查询 COUNT数据不准确
函数做统计的需求,同样在使用该函数时如果处理不当会导致统计出的数据是真实数据N倍的问题,出现重复问题导致统计不准确。出现该问题的原因是关联查询的主表与关联表关联关系不是。张三有三辆车,李四两辆,王五无车,可见统计方法出现了重复统计。MySQL在进行关联查询时,首先扫描主表,以主表为基础数据通过。车主和车辆的关系为1:N,两表通过own_id关联。条件会匹配到张三的车辆表3条数据。在业务开发中常遇到关联查询使用。查询车主的姓名和统计功能。原创 2022-10-10 22:22:58 · 1755 阅读 · 0 评论 -
Spring常用事务传播特性
Spring查询当前是否存在事务,如果已存在事务,创建一个保存点,即若代码逻辑抛出异常,代码回滚到保存点,如果没有活跃的事务,则作用和默认。而不依赖于外部事务,它拥有自己的隔离范围,自己的锁,当内部事务开始执行时,外部事务将被挂起,内部事务结束时,外部事务将继续执行。内部事务异常,外部事务未捕获Service异常时,内部Service异常时,不影响外部事务,仅回滚内部事务。默认事务,如果不存在事务,创建一个事务,然后执行事务操作,最常见的选择。新建事务,不依赖于环境的”内部“事务,这个事务将被完全。原创 2022-10-08 21:51:24 · 622 阅读 · 0 评论 -
从Mapper到JavaBean源码层面解析ResultMap是怎么映射的
起点:源码下载:本文以3.3.x分支版本源码为例。在源码工程的test中以NestedQueryCacheTest测试类下的testThatNestedQueryItemsAreRetrievedFromCache为例:该方法中调的Mapper为:<resultMap id="selectAuthor" type="org.apache.ibatis.domain.blog.Author"> <id column="id" property="id" /> <原创 2022-05-29 21:23:08 · 379 阅读 · 0 评论 -
MySQL:concat拼接字段导致数据为空问题解决方案
使用MySQL concat函数进行拼接不同字段时,如果遇到拼接变量其中一个是Null值的情况,会导致整个拼接的字段为Null。看例子:select iv.id as vehicleIdfrom vehicle ivwhere iv.id < 5order by iv.id;select id, company_namefrom companywhere id = 1;当进行关联查询时,vehicle表中假设有两条数据company_id为null,那么就会导致concat的原创 2022-03-24 17:35:16 · 5334 阅读 · 0 评论 -
并发-MySQL乐观锁
场景商城有种商品仅剩一个库存,用户A的下单请求进入到后端接口,由于用户A的网络环境不太好,导致请求卡死,此时用户B也进入下单页面,由于用户A网络环境不好,并没有执行减库存操作,用户B查询到的库存也是1,那么用户B点击下单按钮,最终剩余一个库存却下单成功了两次,我们需要使用技术手段解决业务上的问题,即:保证不同线程请求进来,当前线程操作的数据没有被其他线程修改过。MySQL乐观锁使用version字段标识版本使用updateTime来标识版本单独新增字段表示版本或使用updateTime字段原创 2022-03-08 10:56:12 · 252 阅读 · 0 评论 -
Java Collection接口分析
原创 2022-03-05 17:02:40 · 84 阅读 · 0 评论 -
使用MySQL统计数据库占用硬盘相关信息
使用MySQL统计数据库占用硬盘相关信息1.查看所有数据库容量大小select table_schema as '数据库',sum(table_rows) as '记录数',sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)'from information_schema.tablesgroup by table_schemao转载 2022-02-16 14:11:38 · 404 阅读 · 0 评论 -
pageHelper-v4.2源码阅读-分页是怎么实现运行的?
pageHelper的分页是怎么实现运行的?下载pageHelper源码,使用pageHelper的官方demo进行Debug试验。源码地址:本文使用分支: 4.2PageHelper.startPage(2, 10, "id desc");点进第一个断点PageHelper.startPage<E> :Element,常表示List<E>,使用泛型的方式是得代码得到复用,达到允许放入不同List的功能。SqlUtil.getLocalPage:SqlUt原创 2022-02-08 10:10:42 · 434 阅读 · 0 评论 -
MySQL group by数据丢失问题
在使用group by时需要注意,group by 关键字后的该列一定是唯一的,如果group列出现数据重复数据时,仅会显示一条数据。为测试该问题,在数据库新增一条重复数据select brand_name from brand group by brand_name;执行结果长这样:这让我想到什么呢,emmmm,Map的key重复的问题。...原创 2022-01-15 23:16:51 · 2641 阅读 · 1 评论 -
MySQL :only_full_group_by解决方案
表结构# 车主表create table owner( id int(10) auto_increment primary key, owner_name varchar(10) null, brand_id int(10) null);# 车辆表create table vehicle( id int(10) auto_increment primary key, brand_i原创 2022-01-15 23:14:18 · 532 阅读 · 0 评论 -
left join关联查询一对多数据重复问题解决方案
写在前面:使用准则:在使用左右连接时,一定要保障主表与关联表的on条件是1:1的关系,以保障正常查询主表数据。实例# 车主表create table owner( id int(10) auto_increment primary key, owner_name varchar(10) null, brand_id int(10) null);# 车辆表create table vehicle( id原创 2022-01-15 23:06:56 · 12786 阅读 · 0 评论 -
count(1)、count(*)、count(列名)的区别
count(1)、count(*)从执行计划来看,两者效果是一致的。当表的数据量大一些时(>1 万),count(1)的性能不如count(*)。当表数据小于1万时,count(1)的性能以微弱优势胜出count(*)。MySQL将count(*)会自动优化为count(1),走聚集索引,由此可见两者基本无差距。count(1)、count(*)、count(列名)在计数上的区别Nation(民族)表数据:执行查询结果:可见:count(列名)不计字段为Null的数据,co转载 2021-12-12 15:31:27 · 631 阅读 · 0 评论 -
MySQL 关联查询规范及联表规则
关联表查询尽量控制在五张表以内(阿里规范中是三张)在关联查询时,尽量使inner join在前,left/right join在后。关联查询时,要给关联表取别名。关联查询时,关联表的字段前需要使用别名.字段名的形式。关联查询时,on关联条件左侧是当前关联表,右侧是其他关联表。select a.a1,b.b1,c.c1 from a as a inner join b as b on b.aid = a.id left join c as c on c.bid = b.id...原创 2021-11-19 19:22:09 · 1885 阅读 · 0 评论 -
牛客网数据库实战题解题思路及答案
SQL1、查找最晚入职员工的所有信息drop table if exists `employees` ; CREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` date NOT NULL,`first_name` varchar(14) NOT NULL,`last_name` varchar(16) NOT NULL,`gender` char(1) NOT NULL,`hire_date` date NOT N原创 2021-07-27 20:57:18 · 419 阅读 · 0 评论 -
Spring的七种事务
官方文档注释说明七种事务PROPAGATION_REQUIRED支持当前事务,如果不存在则创建一个新事务。最常用的选择场景一:外部不开启事务@Servicepublic class User1ServiceImpl implements User1Service { //省略其他... @Override @Transactional(propagation = Propagation.REQUIRED) public void addRequired(Use原创 2021-07-09 14:54:36 · 2418 阅读 · 0 评论 -
fix bug:Spring中事务不生效的问题
事务注解不生效的问题出现该问题的主要原因主要有两点:Spring的事务没有生效出现异常时无法正常回滚Spring事务不生效的情况@Transactional用在非public方法上未通过代理手段调用事务方法事务注解用在非public方法上@Transactionalprivate Access createRecords(AccessDto accessDto);未通过代理调用的情况:Service正常注入Spring中,在调用方法时使用This调用事务方法,Spring不会注原创 2021-07-08 14:14:05 · 201 阅读 · 0 评论 -
MySQL CASE WHEN语法
CASE WHEN语法:简单CASE函数CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女'ELSE '其他' ENDCASE搜索函数CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女'ELSE '其他' ENDCase函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。...原创 2021-06-22 21:58:58 · 249 阅读 · 0 评论 -
MySQL学习笔记(长期更新)
002-字段:这么多字段类型,该怎么定义字段评估:需要考虑存储空间和可靠性的平衡类型选择:确保数据不会超过取值范围注意:精度问题:浮点数存在精度丢失的问题,对精度要求高的字段(如价格)不要使用,原因是MySQL采用二进制存储数据,如果尾数不是0或5,就需要使用四舍五入的方式来表达,定点数类型:DECIMAL(将十进制数的整数部分和小数部分拆开,分别转换成十六进制数存储)。主键问题text类型长度不定,所以无法做主键,可使用char、varchar类型时间类型项目中使用时间类型优先考虑使用原创 2021-05-24 22:03:37 · 273 阅读 · 0 评论 -
MySQL关联表插入数据(insert into select语法)
批量新增A表数据,A表的某字段需要关联B表查询数据结果。SQL语法如下:insert into a (a1, a2, a2, a4)select b1, b2, b3 (....) a2, a3, a4 from b;其中A表是需要插入数据的表,select B表的某字段,根据A表的顺序放置,不然会无法匹配字段,导致无法插入,而后可以根据顺序填写A表字段所需的值,最后补上 from xxx表。现有user、role表,需求:在批量新增用户时,将role的id字段作为user表的role_id原创 2021-05-17 13:21:31 · 13141 阅读 · 1 评论