
数据库
欧皇小德子
这个作者很懒,什么都没留下…
展开
-
数据库 -> 简述MyISAM和InnoDB的区别
简述MyISAM和InnoDB的区别MyISAM:不⽀持事务,但是每次查询都是原⼦的;⽀持表级锁,即每次操作是对整个表加锁;⼀个MYISAM表有三个⽂件:索引⽂件、表结构⽂件、数据⽂件;采⽤⾮聚集索引,索引⽂件的数据域存储指向数据⽂件的指针。InnoDb:⽀持ACID的事务,⽀持事务的四种隔离级别;⽀持⾏级锁及外键约束:因此可以⽀持写并发;⼀个InnoDb引擎存储在⼀个⽂件空间(共享表空间,表⼤⼩不受操作系统控制,⼀个表可能分布在多个⽂件⾥)也有可能为多原创 2022-03-15 23:43:45 · 998 阅读 · 0 评论 -
数据库 -> 什么是MVCC
什么是MVCC事务在并发环境下会带来脏读、脏写、不可重复读等诸多问题为了解决这些问题,保证事务的ACID四大特性,出现了诸多隔离级别去解决这些问题MySQL默认采用的隔离级别是可重复读。那么MySQL是怎么划分出4个隔离级别的?答案是通过MVCC(Multi-Version Concurrency Control)机制。多版本并发控制:是一种利用版本号来控制事务读取数据的它类似于的CAS、AQS这类乐观锁机制主要是利用undolog和read view来控制实现这里面就不细致讲了原创 2022-03-15 21:57:40 · 832 阅读 · 0 评论 -
数据库 -> ACID靠什么保证的?
ACID靠什么保证的?原子性原子性是由 undolog 日志来保存的,它记录了需要回滚的日志信息。事务回滚时,撤销已经执行成功的 SQL 语句,什么意思?我们做增、删、改这样一些 SQL 操作,它之前已经保留好一个历史版本数据了,而这个历史版本数据会存在于 undolog 中我们写一条insert,就会记录一条delete所以当你进行回滚的时候,它会找到你对应的一个历史版本数据然后进行回写,把之前成功执行的 SQL 语句给你撤销掉,这个时候就完成了最基本的一个回滚操作,这是原子性对原创 2022-03-15 21:57:09 · 1606 阅读 · 1 评论 -
数据库 -> JDBC实现
JDBC实现JDBC是由java编程语言编写的类及接口组成,同时它为程序开发人员提供了一组用于实现对数据库访问JDBC API,并支持SQL语言。利用JDBC可以将JAVA代码连接到oracle、DB2、SQLServer、MYSQL等数据库,从而实现对数据库中的数据操作的目的。JDBC的主要功能如下:(1)建立与数据库或者其他数据源的链接(2)向数据库发送SQL命令(3)处理数据库的返回结果JDBC中常用类和接口连接到数据库(Connection)建立操作指令(Stat原创 2022-03-15 21:33:47 · 265 阅读 · 0 评论 -
数据库 -> 事务的基本特性和隔离级别
事务的基本特性和隔离级别事务基本特性ACID分别是:原⼦性指的是⼀个事务中的操作要么全部成功,要么全部失败。⼀致性指的是数据库总是从⼀个⼀致性的状态转换到另外⼀个⼀致性的状态。隔离性指的是⼀个事务的修改在最终提交前,对其他事务是不可⻅的。持久性指的是⼀旦事务提交,所做的修改就会永久保存到数据库中。隔离性有4个隔离级别● read uncommit 读未提交,可能会读到其他事务未提交的数据,也叫做脏读。● read commit 读已提交,两次读取结果不⼀致,叫做不可重复读。●原创 2022-03-15 00:35:52 · 327 阅读 · 0 评论 -
数据库 -> 对慢查询都怎么优化?
对慢查询都怎么优化?检查慢日志是否开启SHOW VARIABLES LIKE '%slow%';开启慢查询日志方法一: 临时有效/* 开启慢日志 */mysql> set global slow_query_log=on;Query OK, 0 rows affected (0.08 sec)/* 设置慢查询时间阈值 -> sql查询数据超过了就打印日志 */mysql> set global long_query_time=3600;Query OK, 0原创 2022-03-15 00:28:54 · 1291 阅读 · 0 评论 -
数据库 -> 索引设计的原则?
索引设计的原则?查询更快、占⽤空间更⼩ -> 主键: 整型 + 自增适合索引的列是出现在where⼦句中的列,或者连接⼦句中指定的列要选择最常作为访问条件的列作为主键,提高查询的效率不要过度索引。索引需要额外的磁盘空间,在修改表内容的时候,索引会进⾏维护,索引列越多,这个时间就会越⻓,**尽可能选择较短的数据类型,**可以有效地减少索引的磁盘占用。多表查询有外键的列要建⽴索引更新频繁字段不适合创建索引选择唯一性索引...原创 2022-03-14 23:26:41 · 501 阅读 · 0 评论 -
数据库 -> Mysql索引的数据结构,各⾃优劣
Mysql索引的数据结构,各⾃优劣InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝⼤多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余⼤部分场景,建议选择BTree索引。B+树:B+树是⼀个平衡的多叉树,一个节点可以有多个数据内容,这样就不会出现二叉树那样数据庞大的时候,树的高度比较高的情况,查询的次数就会少B+树叶子节点间有指针相互链接,并且会维护了索引的顺序的,所以有顺序、有相邻的引用,这样在执行范围查找的原创 2022-03-14 22:03:13 · 1748 阅读 · 0 评论 -
数据库 -> 表索引为什么使用主键+整型+自增
表索引为什么使用主键+整型+自增主键不用多说,查询效率问题整型+自增现在的MySQL是InnoDB的数据引擎,底层是B+树InnoDB必须有主键,因为整个B+树都是靠这索引来维护的,没有索引整个表就建不起来当然我们不主动加主键索引,InnoDB也会默认自己加上的让InnoDB自己加主键就会更加影响效率,要么它选择一个字段做索引,要么多加一个字段做索引它放在都要一个那我们为什么不自己定,这样也还会有上面其他效率问题B+树底层也是用二分法来对树进行一层一层的查找的那么索引使用整原创 2022-03-14 21:25:02 · 410 阅读 · 0 评论 -
数据库 -> Mysql聚簇和⾮聚簇索引的区别
Mysql聚簇和⾮聚簇索引的区别因为英文翻译为中文的原因有叫聚簇和⾮聚簇的也叫聚集和⾮聚集的,用聚集可能好理解一点聚集索引: 就是聚集了索引和数据的data数据放在一个xx.myd的文件里面索引是放在xx.myi的文件里面如果有一个数据引擎,将索引和数据放在一个文件里面的,就是聚集索引了InnoDB就是这样的一个数据引擎,它会把表里面的数据和索引放在一个文件里面它必须会有一个主键,就算我们没有指定,它也会帮我们创建的因为它需要一个索引,用索引存数据到索引的位置⾮聚集索引:原创 2022-03-14 21:13:14 · 453 阅读 · 0 评论 -
数据库 -> 索引的基本原理
索引的基本原理索引的本质 -> 索引的本质是一种排好序的数据结构,目的在于提高查询效率。MySQL 中最常用的索引的数据结构是 B+ 树索引的基本原理也就是B+ 树的基本原理一个树节点可以存放多个数据红黑树是不可以一个节点存多个数据的,B+ 树的高度比红黑树低树的叶子节点是排好序的,跟链表一样排序有前后引用的B树是没有排序的,B树不好进行范围查询B+ 有排序,做范围查找的是否就可以根据链表一样的结构向前或向后查询基本原理就是通过B+树的结构优点查询数据原创 2022-03-14 20:49:56 · 917 阅读 · 0 评论 -
Mybatis -> #{}和${}的区别是什么?
#{}和${}的区别是什么?**#{}**是预编译处理、是占位符, **${}**是字符串替换、是拼接符。Mybatis 在处理**#{}时,会将 sql 中的#{}**替换为?号,调⽤ PreparedStatement 来赋值;Mybatis 在处理时**∗∗就是把∗∗{}**就是把**∗∗就是把∗∗{}**替换成变量的值,调⽤ Statement 来赋值;#{} 的变量替换是在DBMS 中、变量替换后,#{} 对应的变量⾃动加上单引号**∗∗的变量替换是在DBMS外、变量原创 2022-03-09 22:32:05 · 310 阅读 · 0 评论 -
MyBatis -> MyBatis 与Hibernate 有哪些不同?
MyBatis 与Hibernate 有哪些不同?SQL 和 ORM 的争论,永远都不会终⽌开发速度的对⽐:Hibernate的真正掌握要⽐Mybatis难些。Mybatis框架相对简单很容易上⼿,但也相对简陋些。⽐起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项⽬需求去考虑究竟哪⼀个更适合项⽬开发⽐如:⼀个项⽬中⽤到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就原创 2022-03-09 22:28:05 · 340 阅读 · 0 评论 -
Mybatis -> Mybatis的优缺点
Mybatis的优缺点优点:基于 SQL 语句编程,相当灵活,不会对应⽤程序或者数据库的现有设计造成任何影响,SQL 写在XML ⾥,解除 sql 与程序代码的耦合,便于统⼀管理;提供 XML 标签, ⽀持编写动态 SQL 语句, 并可重⽤。与 JDBC 相⽐,减少了 50%以上的代码量,消除了 JDBC ⼤量冗余的代码,不需要⼿动开关连接;很好的与各种数据库兼容( 因为 MyBatis 使⽤ JDBC 来连接数据库,所以只要JDBC ⽀持的数据库 MyBatis 都⽀持)。能原创 2022-03-09 22:18:09 · 698 阅读 · 0 评论 -
Spring -> Spring中的事务实现原理
Spring中的事务实现原理Spring事务底层是基于数据库事务和AOP机制的⾸先对于使⽤了@Transactional注解的Bean,Spring会创建⼀个代理对象作为Bean当调⽤代理对象的⽅法时,会先判断该⽅法上是否加了@Transactional注解如果加了,那么则Spring AOP的机制执行方法前利⽤事务管理器创建⼀个数据库连接并且修改数据库连接的autocommit属性为false,禁⽌此连接的⾃动提交,数据库得保证有这个功能然后执⾏当前⽅法,⽅法中会执⾏s原创 2022-03-07 19:09:04 · 543 阅读 · 0 评论 -
Spring -> Spring事务的实现⽅式和原理以及隔离级别?
Spring事务的实现⽅式和原理以及隔离级别?在使⽤Spring框架时,可以有两种使⽤事务的⽅式,⼀种是编程式的,⼀种是申明式的Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务数据库必须支持执行sql和提交sql的 步骤可以分离@Transactional注解就是申明式的。@Transactional 注解和@EnableTransactionManagement(开启事务管理功能)它是基于 Spring AOP 实现的,搞一个专门针对事务的代理原创 2022-03-06 19:06:34 · 293 阅读 · 0 评论 -
Spring -> 用户金钱交易(数据库)事务实现
1.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:原创 2020-10-16 22:51:48 · 441 阅读 · 0 评论 -
Spring -> @Transactional(),事务参数
@Transactional(propagation = Propagation.REQUIRED) public void transaction(int money, int idadd, int idreduce) { affairImp.update(money, idadd, idreduce); }REQUIRED:支持当前事务,如果不存在则创建新事务。类似于同名的EJB事务属性SUPPORTS:支持当前事务,如果不存在,则以非事务方式执行。MANDATORY:支持当前.原创 2020-10-17 19:15:14 · 233 阅读 · 0 评论 -
MySQL -> 命令练习
cmd:"登陆":-u用户名 -p密码mysql -uroot -p123456"显示所有数据库":需要;database+s--表示复数,多个数据库show databases;"进入一个数据库":use 数据库名--可以不用;use rod;"显示现在已经进入数据库中所有的表":show tables;"显示指定数据库中所有的表":show tables from rod;"查询数据库-现在的位置在哪个数据库":查询用select,使用了类似方法的();select databa原创 2020-10-27 12:44:07 · 143 阅读 · 0 评论 -
MySQL -> 笔记--蓝奏云
蓝奏云地址:https://rod.lanzous.com/b0dkdzl8b原创 2020-10-27 12:54:36 · 688 阅读 · 0 评论 -
MySQL -> DQL:SQL执行顺序,优先级
sql执行顺序:先执行'from'关键字后面的语句,明确数据的来源,它是从哪张表取来的。接着执行'where'关键字后面的语句,对数据进行筛选。再接着执行'group by'后面的语句,对数据进行分组分类。然后执行'select'后面的语句,也就是对处理好的数据,具体要取哪一部分。最后执行'order by'后面的语句,对最终的结果进行排序,'limit' 页面查询。...原创 2020-11-04 17:53:48 · 1786 阅读 · 1 评论 -
MySQL -> DQL:基础查询 简单的查询语句(select),去重(distinct),连接(concat),判断是否为null(ifnull)
“查询表中具体字段”:select 具体字段比如name from 表;“查询表中所有字段”: * 代表所有的select * from 表;“查询常量”:select 110;“查询常数并起个名字”:AS:作为,当做#另起的字段名字:nameselect 100 as name;“查询表达式100+100”:可以进行简单的计算select 100+100;"查询表达式并起个名字":select 100+100 as 和“查询多个数据并新起名字”:格式: 表达式 as原创 2020-11-04 18:25:52 · 1005 阅读 · 0 评论 -
MySQL -> DQL:条件查询:where;条件运算符,逻辑运算符
“条件运算符”:where:条件运算符 > < = ! != <>不等于 用and连接其他条件#计算结果是0 则表示没有成立的条件#计算结果非0 则按规定条件返回 select * from 表 where 钱>100;“逻辑运算符”:where:逻辑运算符 && || !,MySQL中用and和,or或,not非 替换select * from 表 where 钱>100 and 钱<500;select * from 表 where原创 2020-11-04 18:34:56 · 669 阅读 · 0 评论 -
MySQL -> DQL:条件查询之模糊查询:like;between and;in;is null
like:像# % 表示随便多少个字符;# _ 表示一个字符;# \ 转义字符;加了\就不表示原来的意思,如n是字符n,\n变成换行;假设$是代表钱,\$代表字符$,不再表示钱;select * from 表 where name字段 like '%罗%';"第二个字符为德的所有数据": _代替第一个字符;同理有 ___A%:这里有3个_,代表第四个字符是A的数据select * from 表 where name字段 like '_德%';"字段中间有_的数据(特殊字符)":例如原创 2020-11-04 18:51:54 · 604 阅读 · 0 评论 -
MySQL -> DQL:排序查询:order by,asc升序,desc降序
“给 钱 排序”:order by:顺序# desc:降序(大到小,高到低,后到先);# asc升序(小到大,低到高,先到后);# 默认asc升序小到大;asc可以不写默认select * from 表 order by 钱 asc;#默认asc升序小到大select * from 表 order by 钱 ;#默认升序可以不写ascselect * from 表 order by 钱 desc ;#降序大到小“按姓名长度和id编号排序”:select lenth(姓名)原创 2020-11-04 21:06:07 · 696 阅读 · 0 评论 -
MySQL -> DQL:字符函数:upper,lower,concat,substr,instr,length,trim,replace,lpad,rpad
“改变大小写函数”:upper:上(大写);lower:下(小写)select upper('aaaa');# AAAAselect lower('AAAA');# aaaa“连接函数”:concat:连接select concat('aaa','_','bbb');# aaa_bbbselect concat(upper('aaa'),'_',lower('BBB'));# AAA_bbb“选择一段子串”:substr:子串–sub:附属品;string:字符串;substr:附属字符串原创 2020-11-04 21:18:33 · 448 阅读 · 0 评论 -
MySQL -> DQL:数字函数:round,truncate,mod,ceil,floor
“四舍五入”:round:圆-代表四舍五入;第二个参数代表保留小数点后几位select round(1.55);# 2select round(1.22);# 1select round(1.55,1);# 1.6“截断数字”:truncate:截断;第二个参数代表保留小数点后几位select truncate(1.55,1);# 1.5select truncate(1.555,2);# 1.55“求余”:mod:取余;±正负符号看被取余的数的符号,(10,-3)看10为正select原创 2020-11-04 21:25:13 · 231 阅读 · 0 评论 -
MySQL -> DQL:日期函数:now,curdate,str_to_date,date_format,datediff
“显示日期时间”:now:现在select now();# 2020-10-30 16:18:49select TIME(NOW());# 18:11:50SELECT YEAR(NOW());# 2020SELECT MONTH(NOW());# 10SELECT DAY(NOW());# 30“当前的日期”:current:当前,data:日期SELECT CURDATE();# 当前日期SELECT CURTIME();# 当前时间SELECT CURRENT_USER;# 当前用原创 2020-11-04 22:07:36 · 316 阅读 · 0 评论 -
MySQL -> DQL:流程控制函数:if,case when then esle end
“if()”:if(判断语句,真则返回x,假则返回y);类型与三元运算符true返回x,false返回yselect if(10>0,'他是对的','他是错的');# 他是对的“case函数”:方式一:类似swich-caseselect name,case agewhen 10 then '当age=10时,做什么事'when 11 then '当age=11时,做什么事'else 'age=其他时,做什么事'end AS 新列from 表;“case函数”:方式二:类似if嵌原创 2020-11-04 22:14:15 · 179 阅读 · 0 评论 -
MySQL -> DQL:分组函数:sum,avg,min,max,count;分组查询:group by
# 格式:select 分组函数,需要分组的字段 from 表 group by 需要分组的字段;“查询不同部门的平均工资”: group by:分组select avg(工资),部门from 表group by 部门order by avg(工资) desc;# 理解sql执行的顺序,先是from表,有where就where,再group部门分组,# 分好了以后再select后面字段,最后order by排序# 分组后查询任何一个字段都会按照分组后的组查询,查询的依旧是from中的原创 2020-11-05 10:13:26 · 270 阅读 · 0 评论 -
MySQL -> DQL:SQL92语法:连接查询:连接两个表格进行查询(内连接)
表Aname boyid柳岩 8苍老师 9Angelababy 3热巴 2周冬雨 9周芷若 1岳灵珊 9小昭 1双儿 9王语嫣 4夏雪 9赵敏 1表Bid boyname 1 张无忌 2 鹿晗 3 黄晓明 4 段誉 等值连接:“查询两个表中的数据,数据互相有关系”:使用where给定连接条件# 如果不使用where :A表中的每个数据都会匹配B中的数据,一共会出现A*B行原创 2020-11-05 12:13:27 · 1197 阅读 · 0 评论 -
MySQL -> DQL:SQL99:内连接(inner join on),外连接(left/right outer join on),交叉连接(cross)
“SQL92连接两个表:内连接”# 内连接不区分主从表select *from 表1,表2where 表1.字段 = 表2.字段;# 两表重叠部分“SQL99连接两个表:内连接”select *from 表1inner join 表2on 表1.字段 = 表2.字段;# 两表重叠部分,其中inner可以省略where '正常的筛选条件;'SQL99外连接:left/right outer join on外连接包括内连接:外连接=内连接+没有交集的部分(有些数据在从表中有对应的原创 2020-11-05 12:41:39 · 516 阅读 · 0 评论 -
MySQL -> DML:插入(insert into)
插入一个字段:insert into表id boyname 1 张无忌 2 鹿晗 3 黄晓明 4 段誉 "插入一个字段,规规矩矩的插入":insert into 表 (id,boyname) values (10,'name'); "不按照顺序插入":没有任何问题,正确的写法insert into 表 (boyname,id) values ('name',10); "插入两个但是只给一个赋值":-报错,不可以这样,写了就要有对应的数据insert into 表原创 2020-11-07 19:43:31 · 748 阅读 · 0 评论 -
MySQL -> DML:修改(update)
update: update 表 set 列=新值 where 筛选条件"将表中id=1的name修改为aaa":update 表 set name='aaa'where id=1;"将表中name有王字的name修改为aaa,age改为10":update 表 set name='aaa',age=10where name like '%王%';“修改多表的记录”"AB表连接,修改表记录":内连接update 表A ainner join 表B b ON a.id = b.id原创 2020-11-07 20:07:43 · 208 阅读 · 0 评论 -
MySQL -> DML:删除(delete),(truncate table)
删除delete:dalete from 表 where 列=记录;dalete from 表 where id=1;delete from 表 where name like '%2';多表删除:"name=xx时删除A中的记录":delete afrom 表A ainner/left/right join 表B bon a.id = b.idwhere name='xx';"name=xx时删除A,B中的记录":delete a,bfrom 表A ainner/left/r原创 2020-11-07 20:56:05 · 426 阅读 · 0 评论 -
MySQL -> DDL:数据库创建(create),修改(alter),删除(drop)
数据库创建:createcreate database 数据库名;数据库修改:alteralter database 数据库名 character set utf8;数据库删除:dropdrop database 数据库名原创 2020-11-07 21:12:43 · 407 阅读 · 0 评论 -
MySQL -> DDL:数据库表的创建(create),修改(alter add/drop/modify/change/rename column),复制表(like,select子查询方式)
创建表:create table 表 (字段 字段类型(长度 约束))# 可以加 if not exists 表用来判断存不存在表,不存在就创建# if exists,存在就创建,但是没用,存在再创建就会报错,删除的时候可以用,存在就删除create table 表 ( id int(10), name varchar(100), age int(10))修改表:add/drop/modify/change/rename"添加表字段":add columnalter table原创 2020-11-07 22:48:12 · 916 阅读 · 0 评论 -
MySQL -> DDL:数据类型(int,float,doublevarchar,enum,set,datetime)
整形:tinyint,smallint,int,bigintcreate table 表 ( id int, # 默认长度11,长度是个数,不是0-11 id bigint)insert into 表 values(1,1)字符型:char,varcharcreate table 表 ( name char(10), # 默认长度是1,长度10就会开辟10的空间,如果用不完会浪费 name2 varchar(10) # 没有默认长度,长度10是最大值,你写2个字符的,他只会开辟2个字符的原创 2020-11-08 12:52:06 · 413 阅读 · 0 评论 -
MySQL -> DDL:约束(primary,not null,default,unique),标识列(auto_increment:自增长)
主键:primary-非空,唯一(不重复)非空:not null-不能设置为null默认:default唯一:unique-可以为null,但是不能重复外键:foreign key(字段) references 外表(字段)# 约束就直接加在列的后面create table 表 ( id int primary key,# 主键:不能为空,不能重复 name varchar(20) not null,# 非空 age int(10) default 18, zuowei int(10)原创 2020-11-08 19:30:08 · 678 阅读 · 0 评论 -
MySQL -> TCL:事务步骤(transaction),脏读,不可重复读,幻读,查看隔离级别,设置隔离级别
# 开启事务1.set autocommite=0;2.start transaction;# 这个是可选的,写1就可以开启# 具体执行的sqlupdate 表 set name='1' where id=1;insert into 表(id) value(1);# 关闭事务,提交事务,1,2选一个1.commit; # 提交,完成事务的流程2.rollback; # 回滚,程序出现异常,相当于不提交,又回到开启事务之前,执行的sql等于没执行read uncommitted # 可以读原创 2020-11-08 21:52:32 · 168 阅读 · 0 评论