- 数据库指令
- mysql 数据库函数
- 事务
- 索引
- 权限管理和备份
- mysql 备份
- 数据库设计
- sql 语句性能优化
-- 清空student表
TRUNCATE 'student'
SELECT [all | DISTINCT]
{* | table.* | [table.field1[as alias1][,table.field2[as alias2]][,...]]}
FROM table_name [as table_alias]
[left | right | inner join table_name2] -- 联合查询
[WHERE ...] -- 指定结果需满足的条件
[GROUP BY] -- 指定结果按照哪几个字段来分组
[HAVING] -- 过滤分组的记录必须满足的次要条件
[ORDER BY ...] -- 指定查询记录按一个或多个条件排序
[LIMIT ] -- 指定查询的记录从哪条至哪条
select 'StudentNo' as 学号,'StudentName' as 学生姓名 from student as s
-- 函数 CONCAT(a,b) 连接两个字符串
select CONCAT('姓名',StudentName) as 新名字 FROM student
SELECT DISTANCT 'StudentNo' FROM result -- 去除重复数据
SELECT VERSION() -- 查询mysql版本(函数)
SELECT 100*3-1 AS 计算结果 -- 计算结果(表达式)
SELECT @@auto_increment_increment -- 查询自增的步长(变量)
-- 学员考试成绩 +1 分查看
SELECT 'StudentNo','StudentResult'+1 as '提分后' FROM result
<font color='red'>数据库中的表达式:文本值,列,Null,函数,计算表达式,系统变量....</font>
select <font color='orange'>表达式</font> from 表
| 运算符 | 语法 | 结果描述 |
|---|---|---|
| and && | a and b a && b | 逻辑与 |
| or || | a or b a || b | 逻辑或 |
| not ! | not a ! a | 逻辑非 |
| 运算符 | 语法 | 描述 |
|---|---|---|
| is null | a is null | 如果操作符为null,结果为真 |
| is not null | a is not null | 如果操作符不为null,结果为真 |
| between | a between b and c | 若 a 在 b 和 c 之间,则结果为真 |
like |
a like b | 如果a 匹配到 b, 则结果为真 |
| in | a in (a1,a2,a3....) | 假设a在a1,或者a2... 其中的某一个值中,结果为真 |
-- like 结合 %(代表0到任意个字符) _(一个字符)
SELECT figure_name as 历史人物名 FROM history_figure
WHERE figure_name LIKE '周%'
--查询年龄等于 50,60,70的历史人物 in() 里面是一个具体的值
SELECT figure_name,age FROM history_figure
WHERE age in (50,60,70)
-- join(连接的表) on(判断的条件) 连接查询
-- where 等值查询
-- 交集 找到两张表的交叉点
SELECT figure_name,age,sort FROM history_figure as hf
INNER JOIN figure_location as fl ON hf.id = fl.figure_id
-- left join 展示左表所有的数据,右表符合 on 条件的数据,右表不符合的则为空显示
-- inner join 显示两表的信息
-- 左右join 以哪张表为基准
| 操作 | 描述 |
|---|---|
| Inner join | 如果表中至少有一个匹配,则返回行 |
| left join | 返回左表中所有的值、即使右表中没有匹配 |
| right join | 返回右表中所有的值、即使左表中没有匹配 |
| pid(一级id) | categoryid | categoryName |
|---|---|---|
| 1 | 2 | 信息技术 |
| 1 | 3 | 软件开发 |
| 1 | 5 | 美术设计 |
| pid | categoryid | categoryName |
|---|---|---|
| 3 | 4 | 数据库 |
| 2 | 8 | 办公信息 |
| 3 | 6 | web开发 |
| 5 | 7 | ps技术 |
| 父类 | 子类 |
|---|---|
| 信息技术 | 办公信息 |
| 软件开发 | 数据库 |
| 软件开发 | web开发 |
| 美术设计 | ps技术 |
-- sql 自连接解决分级问题,递归
SELECT a.`name` as 父菜单,b.`name` as 子菜单 FROM acl_permission as a,acl_permission as b
WHERE a.id = b.pid AND a.`is_deleted` = 0
先分析要查询哪些字段,再连接表,注意别名,inner join
order by age asc
limit 0,10
-- 子查询(由里及外)
select 'StudentNo','SubjectNo','StudentResult' From 'result'
WHERE SubjectNo = (
SELECT SubjectNo FROM 'subject'
WHERE SUbjectName = '数据库结构-1'
)
-- 嵌套查询
SELECT StudentNo,StudentName FROM student WHERE StudentNo IN(
SELECT StudentNo FROM result WHERE StudentResult > 80 AND SubjectNo = (
SELECT SubjectNo FROM subject WHERE SubjectName = '高等数据-2'
)
)
-- 常用函数 --
--数学运算
SELECT ABS(-8) --绝对值
SELECT CEILING(9.4) --向上取整
SELECT FLOOR(9.4) --向下取整
SELECT RAND() -- 返回 0~1之间的随机数
SELECT SIGN() -- 判断一个数的符号 0-0 复数返回-1,正数返回1
MD5() -- MD5加密
-- 字符串函数
SELECT CHAR_LENGTH('即使最小的帆也能远航') -- 字符串长度
SELECT CONCAT('我','是','谁') -- 拼接字符串
SELECT INSERT('我爱编程HelloWorld',1,2,'超级热爱') -- 查询,从某个位置开始替换某个长度
SELECT LOWER('UUUU') -- 转小写
SELECT UPER('uuuu') -- 转大写
SELECT INSTR('hqz','h') -- 返回第一次出现的子串索引
SELECT REPLACE('hqz','q',h) -- 替换出现的指定字符串
SELECT SUBSTR('hqz','2','1') -- 返回指定的子字符串(源字符串)
SELECT REVERSE('hqz') -- 反转
-- 时间日期函数
SELECT CURRENT_DATE() -- 获取当前日期 2021-03-29
SELECT CURDATE()
SELECT NOW() -- 获取当前时间 2021-03-29 22:09:00
SELECT YEAR(NOW()) -- 获取当前年
-- 系统
SELECT SYSTEM_USER() -- 获取当前登录的用户
SELECT USR()
SELECT VERSION() -- 获取当前sql 的版本
| 函数名称 | 描述 |
|---|---|
| <font color='orange'>COUNT()</font> | 计数 |
| SUM() | 求和 |
| AVG() | 平均值 |
| MAX() | 最大值 |
| MIN() | 最小值 |
| ... | ... |
count(字段) -- 会忽略所有null值
COUNT(*) -- 不会忽略null值 本质:计算行数
COUNT(1) -- 不会忽略null值
SELECT any_value(SubjectName),AVG(StudentResult) as 平均分,MAX(StudentResult) as 最高分,MIN(StudentResult) as 最低分
FROM RESULT r
INNER JOIN `subject` sub
ON r.`SubjectNo` = sub.`SubhectNO`
GROUP BY r.SubjectNo -- 通过什么字段分组
HAVING 平均分 > 80
-- 事务
-- MySQL 是默认开启事务自动提交的
SET autocommit = 0 --关闭事务自动提交
SET autocommit = 1 -- 开启事务自动提交(默认)
-- 手动处理事务
SET autocommit = 0 -- 关闭自动提交
-- 事务开启
START TRANSACTION -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
-- 执行sql
INSERT xx
INSERT xx
-- 提交:持久化(成功)
COMMIT
-- 回滚:回到事务开始之前(失败)
ROLLBACK
-- 事务结束
SET autocommit = 1 -- 开启自动提交
-- 了解
SAVEPOINT 保存点名 -- 设置一个事务的保存点
ROLLBACK TO SAVEPOINT 保存点名 -- 回滚到保存点
RELEASE SAVEPOINT 保存点名 -- 撤销保存点
-- 索引的使用
-- 1、在创建表的时候给字段增加索引
-- 2、创建完毕后,增加索引
-- 显示所有的所有信息
SHOW INDEX FROM student
-- 增加一个全文索引
ALTER TABLE school.student ADD FULLTEXT INDEX `studentName`(`studentName`);
-- EXPLAIN 分析sql执行的状况
EXPLAIN SELECT * FROM student; -- 非全文索引
EXPLAIN SELECT * FROM student WHERE MATCH(studentName) AGAINST('刘');
-- id_表名_字段名
-- CREATE INDEX 索引名 on 表(字段)
CREATE INDEX id_app_user_name ON app_user(`name`);
<font color='orange'>索引在小数据量的时候用处不大,但是在大数据的时候,区别十分明显</font>
Hash类型的索引
Btree:InnoDB 的默认数据结构
-- 创建用户 CREATE USER 用户名 IDENTIFIED BY '密码'
CREATE USER HQZ IDENTIFIED BY '123456'
-- 修改密码(修改当前用户密码)
SET PASSWORD = PASSWORD('123456')
-- 修改密码(修改指定用户密码)
SET PASSWORD FOR HQZ = PASSWORD('111111')
-- 重命名 RENAME USER 原名 TO 新名
RENAME USER hqz TO HQZ2
-- 用户授权 ALL PRIVILEGES 全部的权限 , 库 表
-- ALL PRIVILEGES 除了不能给别人授权,其它都能干
GRANT ALL PRIVILEGES ON *.* TO hqz
-- 查询权限
SHOW GRANTS FOR hqz -- 查看指定用户的权限
SHOW GRANTS FOR root@localhost -- GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
-- 撤销权限 REVOKE 哪些权限 , 在哪个库撤销,给谁撤销
REVOKE ALL PRIVILEGES ON *.* FROM hqz
-- 删除用户
drop user hqz
MySQL数据库备份的方式:
# mysqldump -h 主机 -u 用户名 -p 密码 数据库 表名 > 物理磁盘位置/文件名
mysqldump -hlocalhost -uroot -psqlserver gp history_figure > E:/desktop/a.sql
-- 导入 sql 文件
-- 登录的情况下
source E:/desktop/a.sql
糟糕的数据库设计:
良好的数据库设计:
数据库设计:
设计数据库步骤:(个人博客)
为什么需要数据规范化?
三大范式
第一范式(1NF)
原子性、要求数据库表的每一列都是不可分割的原子数据项
第二范式(2NF)
前提:满足第一方式
每张表只描述一件事情、消除依赖的传递性
第三范式(3NF)
前提:满足第一方式和第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关
规范性 和 性能的问题
关联查询的表不得超过三张表
where及 order by 涉及的列上建立索引。
where子句中对字段进行 null值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。
where子句中使用 != 或 <> 操作符, MySQL只有对以下操作符才使用索引:<font color='orange'><,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。</font>
where子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用 UNION合并查询:select id from t where num=10 union all select id from t where num=20
in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between就不要用 in 了:Select id from t where num between 1 and 3
select id from t where name like '%abc%’或者 select id from t where name like ‘%abc’ 若要提高效率,可以考虑全文检索。而 select id from t where name like ‘abc%’ 才用到索引
where子句中使用参数,也会导致全表扫描。
where子句中对字段进行表达式操作,应尽量避免在where子句中对字段进行<font color='orange'>函数操作</font>
exists 代替 in 是一个好的选择:select num from a where num in(select num from b) 用下面的语句替换:<font color='orange'>select num from a where exists(select 1 from b where num=a.num)</font>
索引 固然可以提高相应的 select的效率,但同时也降低了 insert及 update的效率,因为 insert或 update时有可能会<font color='red'>重建索引</font>,所以怎样建索引需要慎重考虑,视具体情况而定。<font color='orange'>一个表的索引数最好不要超过6个</font>,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
clustered 索引数据列, 因为 <font color='orange'>clustered 索引数据列的顺序就是表记录的物理存储顺序</font>,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered索引数据列,那么需要考虑是否应将该索引建为 clustered索引。
数字型字段,若<font color='orange'>只含数值信息的字段尽量不要设计为字符型</font>,这会降低查询和连接的性能,并会增加存储开销。
varchar/nvarchar 代替 char/nchar , 因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
select * from t ,用具体的字段列表代替 “*”,<font color='yellow'>不要返回用不到的任何字段</font>。
Alias):当在SQL语句中连接多个表时,请<font color='yellow'>使用表的别名并把别名前缀于每个 Column 上</font>.这样一来,就可以减少解析的时间并减少那些由 Column歧义引起的语法错误。
临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb 中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中 “共享锁” 阻塞 “更新锁”,减少了阻塞,提高了并发性能。
nolock,读、写是会相互阻塞的,为了提高并发性能,对于一些查询,可以加上 nolock,这样读的时候可以允许写,但缺点是可能读到未提交的脏数据。使用 nolock 有3条原则。查询的结果用于 <font color='orange'>“插、删、改” </font>的不能加 nolock,查询的表属于频繁发生页分裂的,慎用 nolock!使用临时表一样可以保存 “数据前影”,起到类似 Oracle 的 undo 表空间的功能,能采用临时表提高并发性能的,不要用 nolock 。
表连接(JOIN),考虑使用临时表或表变量存放中间结果。<font color='yellow'>少用子查询</font>,视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
OR的字句可以分解成多个查询,并且通过 UNION连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用 <font color='orange'>UNION all</font> 执行的效率更高.多个 OR 的字句没有用到索引,改写成 UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。
IN后面值的列表中,<font color='yellow'>将出现最频繁的值放在最前面,出现得最少的放在最后面</font>,减少判断的次数。
配制线程数量<最大连接数,启用 SQL SERVER 的线程池来解决,如果还是数量 = 最大连接数+5,严重的损害服务器的性能。
select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = ‘JCNPRH39681’ (A = B ,B = ‘号码’)
select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = ‘JCNPRH39681’ and b.referenceid = ‘JCNPRH39681’ (A = B ,B = ‘号码’, A = ‘号码’)
select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = ‘JCNPRH39681’ and a.personMemberID = ‘JCNPRH39681’ (B = ‘号码’, A = ‘号码’)
exists代替 select count(1) 来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且 count(1) 比 count(*) 更有效率。
“>=”,不要使用“>”。
OLTP表不要超过 <font color='orange'>6</font> 个索引;尽可能的使用索引字段作为查询条件,尤其是聚簇索引,必要时可以通过 index index_name 来强制指定索引;避免对大表查询时进行 table scan,必要时考虑新建索引;在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用;要注意索引的维护,周期性重建索引,重新编译存储过程。
SELECT * FROM record WHERE substrINg(card_no,1,4)=’5378’ (13秒)
SELECT * FROM record WHERE amount/30< 1000 (11秒)
SELECT * FROM record WHERE convert(char(10),date,112)=’19991201’ (10秒)
# 分析:
# WHERE子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成下面这样:
SELECT * FROM record WHERE card_no like ‘5378%’ (< 1秒)
SELECT * FROM record WHERE amount< 1000*30 (< 1秒)
SELECT * FROM record WHERE date= ‘1999/12/01’ (< 1秒)
SQL 语句的,绝不会用循环去实现!
(例如:列出上个月的每一天,用 connect by 去递归查询一下,绝不会去用循环从上个月第一天到最后一天)
oracle的解析器按照从<font color='orange'>右到左</font>的顺序处理 FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在 FROM子句中包含多个表的情况下,你必须<font color='yellow'>选择记录条数最少的表作为基础表</font>。如果有3个以上的表连接查询, 那就需要选择<font color='yellow'>交叉表(intersection table)</font>作为基础表, 交叉表是指那个被其他表所引用的表.
GROUP BY 语句的效率, 可以通过将不需要的记录在 GROUP BY之前过滤掉.下面两个查询返回相同结果,但第二个明显就快了许多.
# 低效:
SELECT JOB , AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING JOB =’PRESIDENT’
OR JOB =’MANAGER’
# 高效:
SELECT JOB , AVG(SAL)
FROM EMP
WHERE JOB =’PRESIDENT’
OR JOB =’MANAGER’
GROUP BY JOB
sql 语句用大写,因为 oracle总是先解析 sql语句,把小写的字母转换成大写的再执行。
表变量代替;大多数时候(99%),表变量驻扎在内存中,因此速度比临时表更快,临时表驻扎在 TempDb 数据库中,因此临时表上的操作需要跨数据库通信,速度自然慢。
约束实现的,尽量不要使用触发器;不要为不同的触发事件(Insert,Update和Delete)使用相同的触发器;不要在触发器中使用<font color='orange'>事务型代码</font>。
主键、外键必须有索引;300万的表应该有索引;连接字段上应该建立索引;Where子句中的字段,特别是大表的字段,应该建立索引;选择性高的字段上;小字段上,对于大的文本字段甚至超长字段,不要建索引;仔细分析,尽量考虑用单字段索引代替;主列字段,一般是选择性较好的字段;AND方式出现在 Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;Where子句中,则分解为多个单字段索引;删除无用的索引,避免对执行计划造成负面影响;存储开销,索引对于<font color='orange'>插入、删除、更新操作也会增加处理上的开销</font>。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。慢查询日志去发现慢查询,使用执行计划去判断查询是否正常运行,总是去测试你的查询看看是否他们运行在最佳状态下。久而久之性能总会变化,避免在整个表上使用 count(*) ,它可能锁住整张表,使查询保持一致以便后续相似的查询可以使用查询缓存,在适当的情形下使用 GROUP BY 而不是DISTINCT,在 WHERE, GROUP BY 和 ORDER BY 子句中使用有索引的列,保持索引简单,不在多个索引中包含同一个列,有时候 MySQL会使用错误的索引,对于这种情况使用 USE INDEX,检查使用 SQL_MODE=STRICT的问题,对于记录数小于5的索引字段,在 UNION 的时候使用 LIMIT 不是是用 OR。
为了 避免在更新前 SELECT,使用 INSERT ON DUPLICATE KEY 或者 INSERT IGNORE ,不要用 UPDATE去实现,不要使用 MAX,使用索引字段和 ORDER BY子句,LIMIT M,N实际上可以减缓查询在某些情况下,有节制地使用,在 WHERE子句中使用 UNION代替子查询,在重新启动的 MySQL,记得来温暖你的数据库,以确保您的数据在内存和查询速度快,考虑持久连接,而不是多个连接,以减少开销,基准查询,包括使用服务器上的负载,有时一个简单的查询可以影响其他查询,当负载增加您的服务器上,使用SHOW PROCESSLIST 查看慢的和有问题的查询,在开发环境中产生的镜像数据中 测试的所有可疑的查询。
MySQL备份过程:
从二级复制服务器上进行备份。在进行备份期间停止复制,以避免在数据依赖和外键约束上出现不一致。彻底停止MySQL,从数据库文件进行备份。
如果使用 MySQL dump 进行备份,请同时备份二进制日志文件 – 确保复制没有中断。不要信任 LVM 快照,这很可能产生数据不一致,将来会给你带来麻烦。为了更容易进行单表恢复,以表为单位导出数据 – 如果数据是与其他表隔离的。
当使用 mysqldump时请使用 –opt。在备份之前检查和优化表。为了更快的进行导入,在导入时临时禁用外键约束。
为了更快的进行导入,在导入时临时禁用唯一性检测。在每一次备份后计算数据库,表以及索引的尺寸,以便更够监控数据尺寸的增长。
通过自动调度脚本监控复制实例的错误和延迟。定期执行备份。
member用 mid做标准进行分表方便查询么?一般的业务需求中基本上都是以 username 为查询依据,正常应当是 username 做 hash 取模来分表吧。分表的话 mysql的partition 功能就是干这个的,对代码是透明的;在代码层面去实现貌似是不合理的。
ID 做为其主键,而且最好的是一个 INT型的(推荐使用 UNSIGNED ),并设置上自动增加的AUTO_INCREMENT 标志。
SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
MySQL查询可以<font color='orange'>启用高速查询缓存</font>。这是提高数据库性能的有效 Mysql优化方法之一。当同一个查询被执行多次时,从缓存中提取数据和直接从数据库中返回数据快很多。
EXPLAIN SELECT 查询用来跟踪查看效果
使用 EXPLAIN关键字可以让你知道 MySQL是如何处理你的 SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。EXPLAIN的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的……等等,等等。
LIMIT 1
fetch游标,或是你也许会去检查返回的记录数。在这种情况下,加上 LIMIT 1 可以增加性能。这样一样,MySQL 数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。
myisam: 应用时以读和插入操作为主,只有少量的更新和删除,并且对事务的完整性,并发性要求不是很高的。
Innodb:事务处理,以及并发条件下要求数据的一致性。除了插入和查询外,包括很多的更新和删除。(Innodb有效地降低删除和更新导致的锁定)。对于支持事务的InnoDB类型的表来说,影响速度的主要原因是 AUTOCOMMIT默认设置是打开的,而且程序没有显式调用 BEGIN开始事务,导致每插入一条都自动提交,严重影响了速度。可以在执行 sql前调用 begin,多条 sql 形成一个事务(即使 autocommit 打开也可以),将大大提高性能。
mediumint 就比 int 更合适)
比如时间字段:datetime 和 timestamp, datetime占用8个字节,而 timestamp 占用4个字节,只用了一半,而 timestamp 表示的范围是1970—2037适合做<font color='yellow'>更新时间</font>
MySQL 可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。
因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,
在定义邮政编码这个字段时,如果将其设置为CHAR(255) ,显然给数据库增加了不必要的空间,
甚至使用 VARCHAR这种类型也是多余的,因为 CHAR(6) 就可以很好的完成任务了。同样的,如果可以的话,
我们应该使用 MEDIUMINT 而不是 BIGIN 来定义整型字段。
应该尽量把字段设置为 NOT NULL,这样在将来执行查询的时候,数据库不用去比较 NULL值。
对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为 ENUM类型。因为在 MySQL 中,ENUM 类型被当作数值型数据来处理,
而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。
char,varchar,text选择区别
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin
我已经开始使用mysql2gem。我试图弄清楚一些基本的事情——其中之一是如何明确地执行事务(对于批处理操作,比如多个INSERT/UPDATE查询)。在旧的ruby-mysql中,这是我的方法:client=Mysql.real_connect(...)inserts=["INSERTINTO...","UPDATE..WHEREid=..",#etc]client.autocommit(false)inserts.eachdo|ins|beginclient.query(ins)rescue#handleerrorsorabortentirelyendendclient.commi
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
文章目录1、自相关函数ACF2、偏自相关函数PACF3、ARIMA(p,d,q)的阶数判断4、代码实现1、引入所需依赖2、数据读取与处理3、一阶差分与绘图4、ACF5、PACF1、自相关函数ACF自相关函数反映了同一序列在不同时序的取值之间的相关性。公式:ACF(k)=ρk=Cov(yt,yt−k)Var(yt)ACF(k)=\rho_{k}=\frac{Cov(y_{t},y_{t-k})}{Var(y_{t})}ACF(k)=ρk=Var(yt)Cov(yt,yt−k)其中分子用于求协方差矩阵,分母用于计算样本方差。求出的ACF值为[-1,1]。但对于一个平稳的AR模型,求出其滞