一、基础
1、表的三范式:
第一范式:列属性不可再分(例如 用户表中常有姓名和电话,如果直接用了一个字段叫 ‘用户信息’,里面存 姓名加电话,这种就不符合一范式,因为属性里还可以再分;再比如收货地址应该单独分‘省市区’,而不是放在一起;又比如班级和学院应该单独分开而不是放同一个字段;等等这些例子)
第二范式:满足了 一范式,并且表中是联合主键,则其他非主键字段需依赖于联合主键而不能只依赖于主键中的某一个字段,即不能出现部分函数依赖(比如表中 课程&学号 共同确定成绩是 ok的,但表里还有 ‘课程学分’ 字段,它其实只需要 ‘课程’ 自己就可以确定,不需要 ‘学号’,这个就不满足 二范式了)(注:如果没有联合主键,二范式就没问题了)
第三范式:满足了 二范式,并且表中非主键字段都得直接依赖主键,而不能是间接,即不能出现 传递依赖(例如表中 ‘学号’ 来确定 ‘班级’是 ok的,但是如果表里还有 ‘班级地址’,它是通过 学号确定班级,班级再确定 班级地址的,这样产生了传递依赖,就不满足 三范式了 )
2、mysql 语法顺序 & 执行顺序:
SELECT
FROM
LEFT JOIN ON
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
范例:
SELECT user.name
FROM user
LEFT JOIN order ON user.id = order.uid
WHERE order.price > 100
GROUP BY user.name
HAVING count(1) > 4
ORDER BY user.name
LIMIT 0,10
整个语句顺序:
FROM(将最近的两张表,进行笛卡尔积)---VT1
ON(将VT1按照它的条件进行过滤,对笛卡尔积进行筛选)---VT2
LEFT JOIN(以左表为基准,对筛选后的笛卡尔积记录处理)---VT3
WHERE(过滤VT3中的记录)--VT4...VTn
GROUP BY(对VT4的记录进行分组)---VT5
HAVING(对VT5中的记录进行过滤)---VT6
SELECT(对VT6中的记录,选取指定的列)--VT7
DISTINCT(如果还有这个字段,则会进行去重)--VT8
ORDER BY(对VT8的记录进行排序)--游标
LIMIT(对排序之后的值进行分页)
注意:如果 JOIN了多个表,那么重复 ON 和 JOIN步骤
WHERE 后面条件的顺序:
mysql 是从左到右
oracle 是从右到左
3、mysql 体系架构
Connectors:客户端连接
Management Serveices & Utilities:管理服务和工具
Connection Pool:连接池,重用客户端连接
SQL Interface:SQL 接口,接收 SQL命令
Parser:解析器,解析 SQL语句并进行 词法 & 语法分析,最后构造成 解析树
Optimizer:优化器,对解析好的 SQL语句进行优化,解析树转换为 查询计划(经过 选取 - 投影 - 联接 )
Cache和Buffer:查询缓存,对 SQL语句进行 hash作为 key,查询结果为 value
Storage Engines:存储引擎接口,给上层服务 调用(它是基于表的,就是表可以单独设置 引擎类型,而不是数据库的)
File System:文件系统,最终数据都是存储到 硬盘文件里
4、mysql 执行流程
服务器通过用户名/密码或者SSL证书进行认证,认证后验证操作权限
查询缓存,如有则返回,没有则进行后面的解析、优化、执行
mysql解析器根据查询sql 经过词法分析、语法分析构造解析树,并按照语法规则验证语句正确性(关键字或者顺序等),然后预处理器进一步校验(表名、字段名等正确性)
查询优化器找到最优执行计划把解析树转化为查询计划(经过选取、投影、联接)
执行计划调用查询执行引擎,查询引擎通过API接口查询数据
查到数据,返回,并存入缓存
5、mysql 存储引擎
InnoDB(5.5.8 之后默认)
MyISAM
6、文件
1、参数文件:
windows:my.ini
linux:my.cnf
2、数据文件:(SHOW VARIABLES LIKE ‘%datadir%’)
InnoDB:.frm 表定义文件、.ibd 独立表空间文件、.ibdata 共享表空间文件
MyISAM:.frm 表定义文件、.myd 数据文件、.myi 索引文件
3、日志文件:
错误 err log:记录错误信息,参数 log_error配置的路径
二进制 binlog:记录了 DDL & DML 的语句,可用来恢复数据,配置 log_bin才能开启,mysql Server层负责而不是存储引擎负责,用来恢复/复制/审查,查看要借助工具 mysqlbinlog,InnoDB的事务未提交前二进制日志写到 binlog_cache_size大小的缓存中,提交后直接就写入二进制文件
事务日志 redo & undo:redo log用于 事务提交和回滚,存储引擎负责,ib_logfile0/ib_logfile1,每个文件默认 8M,写完1再2再1循环,undo放 .ibdata 文件
通用日志 general query log:CRUD 都记录,默认不开启,参数 general_log_file配置的路径
慢查询 slow query log:记录执行超过设定时间 long_query_time的 SQL,配置 slow_query_log=ON 开启,修改 log_output参数为 TABLE,则输出到mysql库下 slow_log表
中继日志:主从复制时, 从机 slave 会用到
7、存储结构
(1)无索引:遍历双向链表,找到对应的页,再从页中遍历单向链表找到数据
(2)有索引:二分查找找到对应的页,若是 辅助索引,则先找到索引对应的主键,用主键去 主键索引 拿数据,若是 主键索引 就直接拿数据
存储机制:日志文件是用 顺序IO 存储,数据文件采用 随机IO存储
8、数据类型
http://c.biancheng.net/view/7175.html
https://www.cnblogs.com/hzcya1995/p/13309479.html
注:数值中字段长度和类型取值范围无关,字段长度只是指明可能显示的最大长度,数据小于指定长度则用空格填充,大于指定长度如果没超过取值范围也是可以正常使用的。
9、常用内置函数
https://blog.csdn.net/hellokandy/article/details/82964077
二、索引
1、简介:索引是一种数据结构,为了加快数据库 查询效率而产生,它是基于 存储引擎的,不同引擎实现索引方式不同,它也占用空间
2、InnoDB & MyISAM 的索引:都是基于 B+Tree实现(B+Tree只有叶子节点存数据, BTree是叶子和非叶子都存数据)
3、分类-存储维度:
聚集索引:按照唯一标识构造B+树,叶子存放行数据(如没主键,则用 唯一索引作为 聚集索引,如还没唯一索引,则 mysql 生成一个隐式的主键),innodb的唯一标识用聚簇索引因为它数据放在一起,但普通索引因为需要先通过普通索引找到叶子节点中的 聚簇索引key,再回表查数据因此它是非聚簇索引。
非聚集索引:叶子存放 数据地址,再通过 数据地址去拿真正的行数据,MyIsam就是非聚簇索引因为需要先通过索引再用 数据地址去找数据
4、分类-使用维度:
主键索引:非空,唯一
唯一索引:可空,唯一
普通索引:可空,不唯一
组合索引:多个列组成
全文索引:MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引
5、最左前缀原则:索引匹配根据建立的顺序,从左到右匹配,一旦断层/范围查询后面就用不到索引,组合索引中使用(参考 https://www.cnblogs.com/ljl150/p/12934071.html)
组合索引 (name,age,sex)
where name='' and age='' and sex='' --可全部用到索引
where name='' and sex='' and age='' --可全部用到索引(因为优化器会调整顺序)
where name='' and sex='' --只有 name用到索引
where age='' and sex='' --没有用到索引
where name='' and address='' and age='' --只有 name用到索引
where name='' and age != '' and sex='' --只有 name用到索引,但如果建立的是 (name,sex,age)那么 sex也能用,因为优化器会优化
存储在 B+Tree里是 (1,1,1),(1,1,2),(1,2,1),(1,2,2),(2,1,1),它是先按第一个排序如 1到2,然后在第一个排好的基础上再对第二个排序
6、索引覆盖 & 回表 & ICP下推:
索引覆盖:查询的列都包含在 索引中(此时 extra中显示是 Using Index )
回表查询:先用 非主键索引拿到 主键索引的值,再通过 主键索引 查其他列的数据,多少条记录就回表几次
索引下推ICP:某些被索引的列,由原来的 MysqlServer 层判断下推到 引擎层去判断,然后再返回 Server层,加快效率,因为 Server和引擎交互次数也是费时间的(5.6开始有的,Extra的值为Using index condition );比如 (name,age)的组合索引在 5.6之前是先用 name去存储引擎查到数据然后返回给 server层进行数据过滤,但 5.6开始就是利用 name,age两个值都放到存储引擎查询数据再返回 server层。
7、索引失效:
不符合 最左原则
索引上用了范围查询/不等号/判空/计算(如 age=age+1)
like 时 % 号在前面
索引字符串没加 引号
索引用了 or
8、创建原则:
(1)需要索引:
主键自动是 索引
频繁查询的字段应该建 索引
多表 关联,关联字段应该建 索引
排序字段可有索引(因为索引用了 B+Tree,B+Tree是有顺序的)
统计或者分组的字段该有索引
(2)不需要索引
表记录少(因为索引也占用空间)
经常要 增删改
重复性较高的字段
查询字段使用 频率不高
9、索引原理:
(1)排好序的数据结构,不用全表扫描
(2)局部性原理 & 磁盘预读:磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,以 页为单位一般为4k或8k。
(3)选用 B+Tree:叶子节点才存数据,非叶子不存数据
三、执行计划 Explain
1、简介:查看 select 执行计划,分析执行过程(测试这个时记得数据库保持一定量的数据,如果只有一两条有时候优化器反而直接用全表扫描更快,会导致现象不是预期的)
2、参数:(参考 https://segmentfault.com/a/1190000008131735)
id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符
select_type: SELECT 查询的类型(1、SIMPLE 表示此查询不包含 UNION 查询或子查询,2、 PRIMARY 表示此查询是最外层的查询,3、 SUBQUERY 子查询中的第一个 SELECT,4、 DEPENDENT SUBQUERY 子查询依赖于外层查询的结果 )
table: 查询的表
partitions: 匹配的分区
type: join 类型(ALL < index < range ~ index_merge < ref < eq_ref < const < system
)
possible_keys: 此次查询中可能选用的索引
key: 此次查询中确切使用到的索引.
ref: 哪个字段或常数与 key 一起被使用
rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
filtered: 表示此查询条件所过滤的数据的百分比
extra: 额外的信息
3、show profiles
四、事务 & MVCC
1、事务基础可看:https://blog.csdn.net/qq_20475615/article/details/93713519
2、redo Log :InnoDB引擎中的重做日志,采用了 预写日志 的策略,数据写到 buffer pool之后,也把 redo日志写到 redolog Buffer(记录索引页、数据页、undolog页),事务提交后,再写到 redo日志文件 (可通过配置修改事务提交和 redo日志落盘机制),成功写入 redo日志,则认为 事务提交成功 ,如果宕机可通过该日志恢复保证数据可靠性。存储引擎负责,ib_logfile0/ib_logfile1,写完1再2再1循环 ,因为日志是 顺序IO 存储 ,数据文件采用 随机IO存储,所以 redo log 比较快。等到 buffer pool中的数据落盘之后,则会清除 redolog日志 。
3、undo Log:存储在共享表空间 .ibada文件 中的回滚段中,每次事务更新都会新增一条事务 undo日志记录,里面有回滚指针记录上一条id值,可用来做回滚。
4、InnoDB 之 MVCC(依赖于 undolog 和 read view)
快照读:普通查询,不加锁,读的是历史版本,在 undolog中。
当前读:增删改,加 写锁,读的是最新版本。
一致性非锁定读:通过 MVCC,如果读的行在 删改,不需要等锁释放,而是直接去 undo读最新可见快照,也就是历史版本。
一致性锁定读:某些情况需要对读加锁保证一致性,可通过 for update加写锁 或者 lock in share mode加读锁。
适用: 两种隔离级别,read_commited 时快照都是最新一份快照,而 repeatbale read则是读第一次查时的那一份。
实现: 它是通过在每行记录后面增加两个隐藏列来进行版本控制(其实还多一个 row_id表示行唯一标识,不过事务我们用到另外两个字段而已),存了两个版本号;新增或者更新时就把事务号作为 当前版本号,删除或更新的旧记录的事务号就作为 删除版本号。如果恢复数据,是需要根据 undolog 一条条往回找,因为每行记录只记录了上一行的历史事务号,即 事务链表。
5、事务实现原理分析
原子性:undolog,undolog用于回滚
持久性:redolog + force log at commit,redolog 用于恢复、force log at commit保证事务提交后 redolog已落盘。
隔离性:MVCC + 锁
一致性:依赖 原子+持久+隔离 来完成
redolog & undolog关联: undolog其实一开始也是在 redolog 里存了一份。一般 commit事务后redolog会刷盘,redolog每秒也会刷盘,如果在 commit前 redolog已经刷盘(即 redologl里的undolog刷盘),那么奔溃重启后就可以去 redolog里找对应的 undolog来回滚数据;但是 commit前如果 redolog还没刷盘,那重启后就只能去存在 .ibdata里找历史的 undolog日志;最后是 commit后的情况,redolog完成即使奔溃后面重启直接 redolog重做新记录即可,不需要恢复数据。
Innodb 中,即使查询语句,其实也是放在一个事务中。
五、锁
1、分类-粒度:
表锁:对整个表加锁,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
行锁:对一行数据加锁,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
元数据锁 MDL:对表做 增删改查时加 MDL读锁,即不能修改表结构;对 表结构做变更加 MDL写锁,即不能增删改
2、表锁分类-功能:(看锁状态:show status like 'table%'; )
意向共享/IS锁:lock table read
意向排他/IX锁:lock table write
3、行锁分类-功能:(看锁状态:show status like 'innodb_row_lock%'; )
共享/S/读锁:lock in share mode,加了之后其他事务能加 共享锁 但不能加 排他锁,但只读是正常的
排他/X/写锁:for update,加了之后其他事务 共享锁 和 排他锁 都不能加,但只读是正常的 (DML会自动加上 排他锁 )
4、行锁分类-范围:
Record Lock记录锁:锁一条记录,使用主键/唯一索引 锁定时产生
Gap Lock间隙锁 :如果用到锁的地方用了 非唯一索引,则会锁定前后记录之间的范围(比如 (id,age) ->(1,3),(3,6),(8,10),如果我 where 用了 age=6,则会把 id 1~8 且 age 3~10 的记录锁住,这里必须是 id 和 age 同时落在范围才算,当然如果是 前后没有记录,则是锁 无穷小/大);或者 唯一索引使用了范围条件,则会锁定范围条件内的数据(比如 主键 where id>1 and id < 5,锁定了范围 1~5之后,插入 id 为 3 或 4 的记录都需要等待)
Next-Key 临键锁:记录+间隙锁,它只有在事务隔离级别为 可重复读 生效(左开右闭)
注:间隙锁是在 可重复度 级别下才会有的
5、死锁:多个事务各自拿了部分资源,都等待对方释放锁
6、InnoDB 锁原理:对索引项加锁,如果一个索引都命不中,则升级为 表锁
7、两阶段锁:同个事务中只能一直加锁,直到最后事务提交或回滚解锁,而不能在事务中边加锁边解锁
8、加锁类型:https://mp.weixin.qq.com/s/qgC3G7tWZfblxSrALKmWgQ
行锁对 索引 加锁,如果执行锁的语句,where 后没有一个用到索引,在 RR级别下则会升级为 表锁
六、性能优化
使用自增主键,不要用 uuid(uuid是散列存储,可能造成原有的页分裂)
合理创建索引
可以合理反规范化
select 少用 * ,count(*),where 里不用 1=1
创建组合索引,用 exists 而不是 in
七、主从复制 & 读写分离
1、主从可看:https://blog.csdn.net/qq_20475615/article/details/98887912
2、读写分离:
八、分库分表
1、mycat:
2、sharding JDBC:https://blog.csdn.net/qq_20475615/article/details/99693224
九、备份
十、参数配置
十一、扩展
1、InnoDB
(1)data page & index page:数据脏页 &索引页,增删改时 缓存的数据和磁盘数据不一致,所以它是脏页
(2)insert buffer page:插入缓冲页
(3)adaptive hash index:自适应 hash,对访问频率高的 热点页建立 哈希索引,提高查询效率
(4)lock info:锁信息,行/表锁信息
(5)data dictionary:数据字典,元数据信息如表结构、数据库/表名、表字段、视图、索引、存储过程、触发器等
(6)redo log buffer:重做日志缓存,
(7)double write:双写,对 缓冲池中的数据进行落盘的时候,数据写到 共享表空间 和 独立表空间 两份,防止写入磁盘奔溃时可以找回。
(8)check point:检查点
(9)局部性原理
(10)查看表结构数据
SELECT
TABLE_NAME as '表名',
COLUMN_NAME as '字段名',
COLUMN_TYPE as '数据类型',
DATA_TYPE as '数据类型',
(case when CHARACTER_MAXIMUM_LENGTH is not null then CHARACTER_MAXIMUM_LENGTH when NUMERIC_PRECISION is not null then NUMERIC_PRECISION else '' end) as '长度',
CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION,
(case when COLUMN_KEY = 'PRI' then '主键' else '' end) as '主键/外键',
IS_NULLABLE as '是否为空',
COLUMN_COMMENT as '备注'
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = ''
SELECT TABLE_NAME,GROUP_CONCAT(COLUMN_COMMENT SEPARATOR ",") FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'ny_dev' group by TABLE_NAME
2、索引为什么不是 哈希表 或者是 其他树?
(1)哈希表:memory中有哈希索引,innodb有自适应哈希
a、哈希冲突可能导致数据散列不均匀,产生很多线性查询导致效率不高
b、范围查询效率不高
c、存储时需要加载所有哈希表到内存,内存耗费大
(2)BST:二叉搜索树
a、如果是递增时,就会变成链表
(3)AVL:二叉平衡树
a、插入的时候需要旋转树,性能较差
(4)Red/Black Tree:红黑树
a、每个节点只能存一个数据,数据多就导致树太深
(5)BTree:B树
a、每个节点能存储多个数据(Innodb每次读取 16K的数据)
3、log buffer刷盘设置
2、逻辑优先级
(1)and 比 or优先级高:如下 select * from user u where u.id = '' or u.id='' and u.type=3,即使前后两个记录都不满足 type=3,但是只有后面的记录会被过滤,因为先执行了后者的 and
你可能感兴趣的:(SSM,mysql,java,sql,数据库)
day11 学习笔记
豆豆
学习 笔记 python
文章目录前言一、类方法二、静态方法三、构造方法四、魔术方法前言通过今天的学习,我掌握了更多Python中有关面向对象编程思想中方法的概念与操作,包括类方法,静态方法,构造方法,魔术方法一、类方法类方法是属于类的行为,一般使用类而非对象进行调用类方法需要使用@classmethod装饰器定义类方法至少有一个形参用于绑定类,约定为cls类和该类的实例都可以调用类方法,但一般不用实例进行调用类方法不能访
java NIO中的FileSystems工具类可以读取本地文件系统,ZIP/JAR等,无需解压处理,还可以复制文件
爱的叹息
Java 基础整理 java nio jar
在JavaNIO(java.nio.file包)中,FileSystems是一个工具类,用于操作和管理文件系统。它提供了静态方法来获取或创建文件系统实例,并支持自定义文件系统实现。以下是其核心功能和用法:1.核心功能(1)获取默认文件系统获取当前运行环境的默认文件系统(如本地文件系统):FileSystemfileSystem=FileSystems.getDefault();(2)创建新的文件系
没有好的学历,Java开发未来的路应该怎么走?
全干程序员demo
技术热文 java 开发语言
没有好的学历,Java开发未来的路应该怎么走?在当今数字化时代,技术发展日新月异,大模型应用、鸿蒙系统等新兴技术领域正在蓬勃发展,为Java开发者带来了新的机遇和挑战。即使没有高学历,Java开发者依然可以通过以下路径在这些新兴领域找到自己的发展方向,实现职业突破。一、拥抱新兴技术,拓宽技术边界(一)大模型应用:从开发到优化大模型技术正在重塑软件开发的各个环节。对于Java开发者来说,可以从以下几
MySQL进阶——提高查询效率之添加索引的全部方式
1加1等于
MySQL sql mysql
索引提高查询效率,本文介绍优化查询时添加索引的多种方式。本文目录一、创建表时添加索引二、使用ALTERTABLE语句添加索引三、使用CREATEINDEX语句添加索引一、创建表时添加索引在使用CREATETABLE语句创建表的同时,可以为表中的列添加索引。适用于在设计表结构时就确定需要添加索引的情况。语法如下:CREATETABLEtable_name(column1datatype,column
如何区别原生页面和H5页面
大汉堡玩测试
功能测试
文章目录前言原生开发特点H5开发特点混合开发怎么区别是原生还是H5总结前言软件采用混合开发的模式时,测试发现了bug找开发沟通有时会找错人,明明是H5模块的错误却找了负责原生模块的开发,显得很不专业~那在测试时该如何区分是原生的报错还是H5报错呢?原生开发原生开发(NativeApp开发),是为特定操作系统(如iOS使用Objective-C/Swift、安卓使用Java/Kotlin)专门开发的
AnythingLLM - 任何文档资源内容转换为任何LLM
小众AI
AI开源 人工智能 AI编程
更多AI开源软件:AI开源-小众AIhttps://www.aiinn.cn/sources一个全栈应用程序,使您能够将任何文档、资源或内容转换为任何LLM都可以在聊天期间用作参考的上下文。此应用程序允许您选择要使用的LLM或矢量数据库,并支持多用户管理和权限。AnythingLLM是一个全栈应用程序,您可以在其中使用商用现成的LLM或流行的开源LLM和vectorDB解决方案来构建一个不折不扣的
共筑智慧城市新生态!YashanDB与荣科科技完成兼容互认证
科技圈快讯
oracle 数据库
近日,深圳计算科学研究院的崖山数据库系统YashanDB与荣科科技股份有限公司的智慧工程移动管理平台V1.0与不动产智能管理系统V1.0成功完成了兼容性互认证,标志着双方在智慧城市建设领域实现关键突破,以国产化高性能数据库技术为核心,为工程建设与不动产管理领域提供安全可控、高效稳定的数字化解决方案。在兼容性互认证过程中,双方针对功能、性能、兼容性以及稳定性等关键指标进行了多轮严格测试,验证了Ya
JavaScript 中的性能优化:从基础到高级技巧
lina_mua
深入 javascript 性能优化 开发语言
1.引言1.1性能优化的重要性在现代前端开发中,性能优化是提升用户体验的关键。无论是页面加载速度、交互响应时间,还是内存占用,性能优化都能显著提升应用的流畅度和用户满意度。1.2本文的目标本文旨在深入探讨JavaScript中的性能优化,从基础到高级技巧,帮助开发者理解性能优化的核心概念,并掌握其在实际开发中的应用。2.性能优化的基础2.1什么是性能优化?性能优化是指通过改进代码、减少资源消耗、优
VsCode配置JDK\Tomcat\Maven
Yang___Xing
javascript VsCode Java java vscode tomcat
1、安装VsCode下载地址:VisualStudioCode-CodeEditing.Redefined安装提示安装完成即可2、安装JDK下载地址:JavaDownloads|Oracle选择版本:按照需求自行选择配置JAVA_HOMEMac的修改mac的打开终端,输入open~/.zshrc新增exportPATH="/yourpath/jdk-1.8.jdk/Contents/Home/bi
哈希表的前沿演进:从经典实现到未来潜力
大富大贵7
程序员知识储备1 程序员知识储备2 程序员知识储备3 经验分享
摘要:哈希表(HashTable)作为一种基本且高效的数据结构,已广泛应用于计算机科学的各个领域。从数据库的索引、缓存系统到密码学、分布式系统中,哈希表都发挥着至关重要的作用。随着计算需求的不断增长,哈希表的性能优化及其新型变种已成为当前研究的热点。本文将探讨哈希表的经典实现方式及其优化技术,并展望未来在量子计算、分布式存储等领域的潜在应用。1.引言:哈希表作为一种具有常数时间复杂度(O(1))的
C++小课堂——friend友元
New_Teen
C++ c++ 笔记 开发语言 学习
文章目录1.友元函数2.友元类3.友元成员函数友元关系不存在传递性友元小结在C++中,friend关键字用于声明友元(friend)。友元是一种机制,允许某个函数(可以是其它类的成员函数,或者是某个外部函数)或类访问另一个类的私有成员。friend关键字可以用于函数、类、或整个类的成员函数。一般来说,最好在类定义开始或结束前的位置集中声明友元。1.友元函数classMyClass{private:
Hive 实际应用场景及对应SQL示例
小技工丨
大数据随笔 hive sql hadoop 大数据 数据仓库
Hive实际应用场景及对应SQL示例一、日志分析场景**场景说明:**处理大规模日志数据(如Web访问日志),分析用户行为或系统运行状态。SQL示例:--统计每日UV(用户访问量)SELECTdate,COUNT(DISTINCTuser_id)ASdaily_uvFROMweb_logsWHEREevent_type='page_view'GROUPBYdate;技术要点:使用DIST
MyBatis 中的缓存机制
JiaHao汤
Mybatis mybatis
文章目录一级缓存二级缓存MyBatis中的缓存是用于提高数据访问性能的一个重要机制。它可以将查询结果缓存在内存中,避免重复查询数据库,从而加快数据访问速度。MyBatis中存在一级缓存和二级缓存,一级缓存和二级缓存是相互独立的,它们并不共享缓存数据。一级缓存默认开启;而二级缓存默认关闭,如果需要开启二级缓存,则需要手动配置进行开启。在使用MyBatis中的缓存时,需要关注缓存的有效性和管理。由于缓
#Hadoop全分布式安装 #mysql安装 #hive安装
砸吧砸吧
hadoop hive yarn mysql
分布式(多台机器部署不同组件)与集群(多台机器部署相同组件)概念。Linux基础命令linux具有文件数:目录、文件,从根目录开始,路径具有唯一性。pwd:显示当前路径特殊符号:/:根目录.:隐藏文件,如果路径以.开始,表示当前目录下..:当前目录下的上一级~:当前目录的home目录--help:帮助命令使用linux常用操作命令tab键:自动补全ls:显示指定目录内容默认:当前路径-a:显示所有
【JavaEE】Mybatis 简单启动
鸽鸽程序猿
JavaEE java-ee mybatis 数据库
目录一、Mybatis简介二、MyBatis⼊⻔2.1创建项目2.2准备数据2.3配置文件2.4实体类2.5执行结果一、Mybatis简介Mybatis是一个操作数据库驱动的持久层框架,用来简化JDBC操作的,SpringBoot集成了这个框架。MyBatis本是Apache的⼀个开源项⽬iBatis,2010年这个项⽬由apache迁移到了googlecode,并且改名为MyBatis。2013
计算机网络技术服务管理基于Spring Boot-SSM
QQ1978519681计算机程序
网络 计算机毕业设计 毕业设计 数据库 spring boot
目录一、引言二、用户需求分析三、功能介绍3.1.资源管理:3.2.故障管理:3.3.性能管理:3.4.安全管理:3.5.配置管理:3.6.日志管理:3.7.用户管理:3.8.自动化任务调度:3.9.Web界面管理:3.10扩展性与集成性:四、技术介绍4.1系统架构与技术选型4.2技术选型理由:五、性能需求分析六、安全需求分析结论一、引言随着信息技术的飞
JavaScript 模块化语法 import、export详解
qq39138814
javascript 开发语言 ecmascript
JavaScript模块化语法import、export详解1.为什么需要模块化?在JavaScript早期,所有代码都是写在一个全局作用域中,这样做的问题是:变量污染:所有变量、函数都是全局的,容易互相干扰。文件依赖管理困难:多个JS文件之间的依赖关系混乱,难以维护。代码复用困难:无法方便地拆分和复用代码。为了解决这些问题,模块化方案应运而生。2.JavaScript模块化的发展2.1早期的模块
SpringBoot配置文件加载优先级
不修×蝙蝠
spring boot 后端 java 优先级
在SpringBoot项目中,配置属性的优先级是一个重要的概念,它决定了当存在多个配置源时,哪个配置源的属性将被应用。以下是SpringBoot中配置属性的优先级,从最高到最低:命令行参数:命令行参数具有最高的优先级。SpringBoot项目被启动时,可以通过命令行传递参数,这些参数将覆盖其他所有配置源中的相同属性。java-jaryour-application.jar--spring.data
SpringMVC系列之整合Thymeleaf【Thymeleaf整合springmvc介绍及Thymeleaf基础概念、使用语法详解】
吕鑫洋
SpringMVC系列 java html js spring mvc
Thymeleaf是java的模板引擎,可以将动态页面静态化;目前使用较多的模板引擎:Velocity、Freemarker、Thymeleaf一、Maven依赖Thymeleaf整合springmvc共需要两个jar:1.thymeleaf2.thymeleaf-spring5org.thymeleafthymeleaf3.0.9.RELEASEorg.thymeleafthymeleaf-sp
Redis: 深入解析高性能内存数据库的实现原理
一休哥助手
数据库 数据库 redis 缓存
一、Redis简介Redis是一种基于内存的键值存储数据库,支持丰富的数据类型,如字符串、列表、集合、有序集合和哈希表。它不仅具有极高的性能,还支持数据持久化、主从复制和分布式架构,使其在各种应用场景中表现出色。1.1Redis的特点高性能:Redis所有操作都在内存中完成,读写速度非常快。丰富的数据类型:支持字符串、列表、集合、有序集合和哈希表等多种数据类型。持久化:支持RDB(RedisDat
精挑20题:MySQL 8.0高频面试题深度解析——掌握核心知识点、新特性和优化技巧
dblens 数据库管理和开发工具
mysql mysql 数据库 面试
1.MySQL8.0中,为什么查询缓存被移除?答案:原因:查询缓存对频繁更新的表效果差,任何对该表的写操作都会清空所有相关缓存,导致缓存命中率低,反而增加开销。替代方案:使用应用层缓存(如Redis)。优化查询和索引,减少对缓存的依赖。MySQL8.0改进:通过索引优化、并行查询等提升性能,弥补查询缓存缺失的影响。2.InnoDB的行锁和表锁分别在什么场景下使用?答案:行锁:高并发场景下更新或查询
day01-基本查询
elasticsearch
day011.index3条docPUTbooks/_doc/1{"title":"EffectiveJava","author":"JoshuaBloch","release_date":"2001-06-01","amazon_rating":4.7,"best_seller":true,"prices":{"usd":9.95,"gbp":7.95,"eur":8.95}}PUTbooks/
Neo4j GDS-02-graph-data-science 插件库安装实战笔记
后端java
neo4japoc系列Neo4jAPOC-01-图数据库apoc插件介绍Neo4jAPOC-01-图数据库apoc插件安装neo4jonwindows10Neo4jAPOC-03-图数据库apoc实战使用使用Neo4jAPOC-04-图数据库apoc实战使用使用apoc.path.spanningTree最小生成树Neo4jAPOC-05-图数据库apoc实战使用使用labelFilterNeo4
JavaScript对象全解析:从宿主到内置,深入理解对象分类
码农的时光故事
前端 javascript
一、JavaScript对象全景图JavaScript对象系统远比表面看起来复杂,我们可以将其分为以下五大类:类别描述示例宿主对象由运行环境提供的对象(如浏览器中的DOM)window、document固有对象标准规定随运行时自动创建的基础对象Array、Date原生对象通过内置构造器创建的特权对象newArray()、newMap()普通对象用户创建的常规对象{}、newObject()特殊行为
【MySQL必知必会】数据库操纵语言(DML)超全总结:增删改查一文搞定!
秀儿还能再秀
数据库 MySQL 学习笔记
一、DML简介数据库操纵语言(DataManipulationLanguage,DML)是SQL的核心组成部分,主要用于对数据库中的数据进行增(INSERT)、删(DELETE)、改(UPDATE)、查(SELECT)操作,掌握DML都是必备技能!二、核心操作详解1.插入数据:INSERT--插入单条数据(全字段)INSERTINTO表名VALUES(值1,值2,...);--指定字段插入INSE
JAVA学习-练习试用Java实现“对大数据集中的网络日志进行解析和异常行为筛查”
守护者170
java学习 java 学习
问题:编写一个Spark程序,对大数据集中的网络日志进行解析和异常行为筛查。解答思路:下面是一个简单的Spark程序示例,用于解析网络日志并筛查异常行为。这个示例假设日志文件格式如下:timestamp,ip_address,user_id,action,event,extra_info2023-01-0112:00:00,192.168.1.1,123,login,success,none202
JAVA学习-练习试用Java实现“实现一个Spark应用,对大数据集中的文本数据进行情感分析和关键词筛选”
守护者170
java学习 java 学习
问题:实现一个Spark应用,对大数据集中的文本数据进行情感分析和关键词筛选。解答思路:要实现一个Spark应用,对大数据集中的文本数据进行情感分析和关键词筛选,需要按照以下步骤进行:1.环境准备确保的环境中已经安装了ApacheSpark。可以从[ApacheSpark官网](https://spark.apache.org/downloads.html)下载并安装。2.创建Spark应用以下是
pear-admin-boot开发框架使用记录(三)
后青春期的诗go
经验分享 java spring boot spring log4j mybatis
一、实现部门选择操作用于从组织架构里选择出部门的操作,如开发日志管理模块,创建人新增日志时可以通过选择框选择相应共享的部门。数据库表调整在数据表添加2个字段:sharedeptid共享部门idvarcharsharedeptname共享部门名称varchar前端html页面调整页面添加如下代码:共享部门前端JS调整添加如下代码:letdtree=layui.dtree;dtree.renderSe
基于koajsAdmin+mongodb的后台管理快速开发框架安装运行记录
后青春期的诗go
经验分享 mongodb 数据库 node.js vue.js elementui
前置操作下载源码源码地址:https://gitee.com/zhoushuigui/koajs-admin安装mongodb数据库并连接安装yarnnpminstallyarn-g安装nodemonnpminstallnodemon-g前端运行安装依赖进入项目根目录,在命令行执行如下命令安装依赖:yarn--registry=https://registry.npmmirror.com启动服务y
Redis 详解
z小天才b
Redis redis 数据库 缓存
1.NoSQL的核心概念和应用场景核心概念NoSQL(NotOnlySQL):一类非关系型数据库的统称,专为处理大规模数据存储而设计特点:高扩展性、高性能、灵活的数据模型、分布式架构CAP理论:一致性(Consistency)、可用性(Availability)、分区容错性(Partitiontolerance),NoSQL通常优先保证AP或CP主要类型键值存储:Redis,Memcached文档
Nginx负载均衡
510888780
nginx 应用服务器
Nginx负载均衡一些基础知识:
nginx 的 upstream目前支持 4 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比
RedHat 6.4 安装 rabbitmq
bylijinnan
erlang rabbitmq redhat
在 linux 下安装软件就是折腾,首先是测试机不能上外网要找运维开通,开通后发现测试机的 yum 不能使用于是又要配置 yum 源,最后安装 rabbitmq 时也尝试了两种方法最后才安装成功
机器版本:
[root@redhat1 rabbitmq]# lsb_release
LSB Version: :base-4.0-amd64:base-4.0-noarch:core
FilenameUtils工具类
eksliang
FilenameUtils common-io
转载请出自出处:http://eksliang.iteye.com/blog/2217081 一、概述
这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。
xml文件解析SAX
不懂事的小屁孩
xml
xml文件解析:xml文件解析有四种方式,
1.DOM生成和解析XML文档(SAX是基于事件流的解析)
2.SAX生成和解析XML文档(基于XML文档树结构的解析)
3.DOM4J生成和解析XML文档
4.JDOM生成和解析XML
本文章用第一种方法进行解析,使用android常用的DefaultHandler
import org.xml.sax.Attributes;
通过定时任务执行mysql的定期删除和新建分区,此处是按日分区
酷的飞上天空
mysql
使用python脚本作为命令脚本,linux的定时任务来每天定时执行
#!/usr/bin/python
# -*- coding: utf8 -*-
import pymysql
import datetime
import calendar
#要分区的表
table_name = 'my_table'
#连接数据库的信息
host,user,passwd,db =
如何搭建数据湖架构?听听专家的意见
蓝儿唯美
架构
Edo Interactive在几年前遇到一个大问题:公司使用交易数据来帮助零售商和餐馆进行个性化促销,但其数据仓库没有足够时间去处理所有的信用卡和借记卡交易数据
“我们要花费27小时来处理每日的数据量,”Edo主管基础设施和信息系统的高级副总裁Tim Garnto说道:“所以在2013年,我们放弃了现有的基于PostgreSQL的关系型数据库系统,使用了Hadoop集群作为公司的数
spring学习——控制反转与依赖注入
a-john
spring
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
用spool+unixshell生成文本文件的方法
aijuans
xshell
例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下:
set pages 50000;
set lines 200;
set trims on;
set heading off;
spool /oracle_backup/log/test/dept.lst;
select deptno||','||dname||','||loc
1、基础--名词解析(OOA/OOD/OOP)
asia007
学习基础知识
OOA:Object-Oriented Analysis(面向对象分析方法)
是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。
OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)
浅谈java转成json编码格式技术
百合不是茶
json编码 java转成json编码
json编码;是一个轻量级的数据存储和传输的语言
在java中需要引入json相关的包,引包方式在工程的lib下就可以了
JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非
常适合于服务器与 JavaScript 之间的数据的交
web.xml之Spring配置(基于Spring+Struts+Ibatis)
bijian1013
java web.xml SSI spring配置
指定Spring配置文件位置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-dao-bean.xml,/WEB-INF/spring-resources.xml,
/WEB-INF/
Installing SonarQube(Fail to download libraries from server)
sunjing
Install Sonar
1. Download and unzip the SonarQube distribution
2. Starting the Web Server
The default port is "9000" and the context path is "/". These values can be changed in &l
【MongoDB学习笔记十一】Mongo副本集基本的增删查
bit1129
mongodb
一、创建复本集
假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令:
mongod --port 27017 --dbpath data1 --replSet rs0
mongod --port 27018 --dbpath data2 --replSet rs0
mongod --port 27019 -
Anychart图表系列二之执行Flash和HTML5渲染
白糖_
Flash
今天介绍Anychart的Flash和HTML5渲染功能
HTML5
Anychart从6.0第一个版本起,已经逐渐开始支持各种图的HTML5渲染效果了,也就是说即使你没有安装Flash插件,只要浏览器支持HTML5,也能看到Anychart的图形(不过这些是需要做一些配置的)。
这里要提醒下大家,Anychart6.0版本对HTML5的支持还不算很成熟,目前还处于
Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa
bozch
laravel
昨天在为了把laravel升级到最新的版本,突然之间就出现了如下错误:
ErrorException thrown with message "Declaration of Illuminate\View\Engines\CompilerEngine::handleViewException() should be compatible with Illuminate\View\Eng
编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜
bylijinnan
编程之美
import java.util.Arrays;
import java.util.Random;
public class Nim {
/**编程之美 NIM游戏分析
问题:
有N块石头和两个玩家A和B,玩家A先将石头随机分成若干堆,然后按照BABA...的顺序不断轮流取石头,
能将剩下的石头一次取光的玩家获胜,每次取石头时,每个玩家只能从若干堆石头中任选一堆,
lunce创建索引及简单查询
chengxuyuancsdn
查询 创建索引 lunce
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Docume
[IT与投资]坚持独立自主的研究核心技术
comsci
it
和别人合作开发某项产品....如果互相之间的技术水平不同,那么这种合作很难进行,一般都会成为强者控制弱者的方法和手段.....
所以弱者,在遇到技术难题的时候,最好不要一开始就去寻求强者的帮助,因为在我们这颗星球上,生物都有一种控制其
flashback transaction闪回事务查询
daizj
oracle sql 闪回事务
闪回事务查询有别于闪回查询的特点有以下3个:
(1)其正常工作不但需要利用撤销数据,还需要事先启用最小补充日志。
(2)返回的结果不是以前的“旧”数据,而是能够将当前数据修改为以前的样子的撤销SQL(Undo SQL)语句。
(3)集中地在名为flashback_transaction_query表上查询,而不是在各个表上通过“as of”或“vers
Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件
游其是你
FilenameFilter
这是一个FilenameFilter类用法的例子,实现的列举出“c:\\folder“路径下所有以“.jpg”扩展名的文件。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
C语言学习五函数,函数的前置声明以及如何在软件开发中合理的设计函数来解决实际问题
dcj3sjt126com
c
# include <stdio.h>
int f(void) //括号中的void表示该函数不能接受数据,int表示返回的类型为int类型
{
return 10; //向主调函数返回10
}
void g(void) //函数名前面的void表示该函数没有返回值
{
//return 10; //error 与第8行行首的void相矛盾
}
in
今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl
dcj3sjt126com
centos
今天在测试环境使用yum安装,遇到一个问题:
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
处理很简单,修改文件“/etc/yum.repos.d/epel.repo”, 将baseurl的注释取消, mirrorlist注释掉。即可。
&n
单例模式
shuizhaosi888
单例模式
单例模式 懒汉式
public class RunMain {
/**
* 私有构造
*/
private RunMain() {
}
/**
* 内部类,用于占位,只有
*/
private static class SingletonRunMain {
priv
Spring Security(09)——Filter
234390216
Spring Security
Filter
目录
1.1 Filter顺序
1.2 添加Filter到FilterChain
1.3 DelegatingFilterProxy
1.4 FilterChainProxy
1.5
公司项目NODEJS实践0.1
逐行分析JS源代码
mongodb nginx ubuntu nodejs
一、前言
前端如何独立用nodeJs实现一个简单的注册、登录功能,是不是只用nodejs+sql就可以了?其实是可以实现,但离实际应用还有距离,那要怎么做才是实际可用的。
网上有很多nod
java.lang.Math
liuhaibo_ljf
java Math lang
System.out.println(Math.PI);
System.out.println(Math.abs(1.2));
System.out.println(Math.abs(1.2));
System.out.println(Math.abs(1));
System.out.println(Math.abs(111111111));
System.out.println(Mat
linux下时间同步
nonobaba
ntp
今天在linux下做hbase集群的时候,发现hmaster启动成功了,但是用hbase命令进入shell的时候报了一个错误 PleaseHoldException: Master is initializing,查看了日志,大致意思是说master和slave时间不同步,没办法,只好找一种手动同步一下,后来发现一共部署了10来台机器,手动同步偏差又比较大,所以还是从网上找现成的解决方
ZooKeeper3.4.6的集群部署
roadrunners
zookeeper 集群 部署
ZooKeeper是Apache的一个开源项目,在分布式服务中应用比较广泛。它主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、配置文件管理、同步锁、队列等。这里主要讲集群中ZooKeeper的部署。
1、准备工作
我们准备3台机器做ZooKeeper集群,分别在3台机器上创建ZooKeeper需要的目录。
数据存储目录
Java高效读取大文件
tomcat_oracle
java
读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致
微信支付api返回的xml转换为Map的方法
xu3508620
xml map 微信api
举例如下:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><