-
ON <表名称> --触发器属于某一表:插入此表时, 更新或删除操作会激活触发器. 我们不能安排两个触发器在同一张表的同一事件上。
-
FOR EACH ROW --触发器的执行间隔:FOR EACH ROW通知触发器 每隔一行执行一次动作,而不是整个表。
-
<触发器SQL语句> --触发器包含要触发的触发器SQL句子:这里的句子可以是任何合法的句子, 包括复合语句,但是这里的语句受的限制和函数的一样。
存储过程是什么?
简单来说,就是一组SQL语句集,功能强大,可以实现一些复杂的逻辑功能,类似于JAVA语言方法;
ps:存储过程与触发器有点相似,都是一组SQL但是存储过程是主动调用的,而且功能比触发器更强大,触发器是触发后自动调用的;
有哪些特性
-
输入输出参数可以声明变量if/else, case,while通过编写存储过程,可以实现复杂的逻辑功能;
-
函数的普遍特性:模块化,封装,代码复用;
-
速度快,只有第一次执行需要编译和优化步骤,后续调用可以直接执行,节省上述步骤;
DROP PROCEDURE IF EXISTS `proc_adder`; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_adder`(IN a int, IN b int, OUT sum int) BEGIN #Routine body goes here... DECLARE c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if; set sum = a b; END ;; DELIMITER ; set @b=5; call proc_adder(0,@b,@s); SELECT @s as sum; create table tab2( tab2_id varchar(11) ); DROP TRIGGER if EXISTS t_ai_on_tab1; create TRAILING t_ai_on_tab1 AFTER INSERT ON tab1 for EACH ROW BEGIN INSERT INTO tab2(tab2_id) values(new.tab1_id); end; INSERT INTO tab1(tab1_id) values('0001'); SELECT * FROM tab2;
MySQL优化
-
打开查询缓存,优化查询
-
explain你的select查询可以帮助您分析查询句或表结构的性能瓶颈。EXPLAIN 查询结果还会告诉你如何使用索引主键,如何搜索和排序你的数据表
-
只要使用一行数据limit 1,MySQL在找到数据后,数据库引擎将停止搜索,而不是继续检查下一个符合记录的数据
-
构建搜索字段的索引
-
使用 ENUM 而不是 VARCHAR,如果你有一个字段,如性别、国家、国家、状态或部门,你知道这些字段的值是有限和固定的,那么你应该使用它们 ENUM 而不是VARCHAR。
-
Prepared StatementsPrepared Statements它与存储过程非常相似,在后台运行SQL我们可以使用语句集合 prepared statements 无论是性能问题还是安全问题,都有很多好处。Prepared Statements 您可以检查一些您绑定的变量,以保护您的程序免受SQL注入式攻击
-
垂直分表
-
选择正确的存储引擎
key和index的区别
-
key 它是数据库的物理结构,包括两个意义和功能,一个是约束(关注约束和规范数据库的结构完整性),另一个是索引(辅助查询)。primary key, unique key, foreign key 等
-
index它是数据库的物理结构,只是辅助查询,创建时会在另一个表空间(mysql中的innodb表空间)以类似目录的结构存储。索引分为前缀索引、全文索引等。
Mysql 中 MyISAM 和 InnoDB 有什么区别?
区别:
-
InnoDB支持事务,MyISAM不支持,对InnoDB每一条SQL默认情况下,语言被包装成事务并自动提交,这将影响速度,因此最好使用多种语言SQL语言放在begin和commit组成事务;
-
InnoDB支持外键,而MyISAM不支持。包含外键的一个InnoDB表转为MYISAM会失败;
-
InnoDB是收集索引,数据文件与索引绑定,必须有主键,通过主键索引效率很高。但辅助索引需要两次查询,先查询主键,再通过主键查询数据。所以主键不要太大,因为主键太大,其他索引也会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
-
InnoDB不保存表的具体行数,执行select count(*) from table需要全表扫描MyISAM用变量保存整个表的行数,执行上述句子时只需读出变量,速度非常快;
-
Innodb不支持全文索引MyISAM支持全文索引,查询效率MyISAM要高;
如何选择:
-
是否支持事务,如果你想选择innodb,若无需考虑MyISAM;
-
如果表中的绝大多数只是阅读查询,可以考虑MyISAM,如果读写频繁,请使用InnoDB。
-
系统崩溃后,MyISAM更难恢复,能否接受;
-
MySQL5.5版本开始Innodb已经成为Mysql默认引擎(以前是MyISAM),这表明它的优势是显而易见的。如果你不知道该用什么,那就用吧InnoDB,至少不差。
创建数据库表的注意事项
一、字段名及字段配制合理性
-
消除关系不密切的字段
-
字段命名应该有规则和相应的含义(不是英语的一部分,拼音的一部分,类似的a.b.c这样一个意义不明的字段)
-
尽量不要使用缩写字段命名(大部分缩写字段含义都不清楚)
-
不要混用字段(如果要有可读性,可以用下划线连接多个英语单词)
-
不要使用保留字或关键字
-
保持字段名和类型的一致性
-
仔细选择数字类型
-
为文本字段留出足够的余量
建议完成后处理系统特殊字段
-
添加删除标记(如操作员、删除时间)
-
建立版本机制
三、表结构合理配置
-
多字段的处理是表中是否有字段可以分解成更小、更独立的部分(例如,人可以分为男性和女性)
-
处理多值字段时,表可分为三个表,使检索和排序更加调节,并保证数据的完整性!
四、其它建议
-
独立存储大数据字段,以影响性能(如简介字段)
-
使用varchar类型代替char,因为varchar动态分配长度,char指定长度固定。
-
在查询和索引定义上,为表创建主键对没有主键的表有一定的影响。
-
避免表字段运行为null,建议设置默认值(例如:int类型设置默认值为0)在索引查询中,效率立显!
-
最好在唯一和非空字段上建立索引。建立过多的索引对以后的插入和更新有一定的影响(考虑到实际情况)。
redis
redis单线程问题
单线程是指网络请求模块使用一个线程(因此不需要考虑并发安全),即一个线程处理所有网络请求,其他模块仍使用多个线程。
为什么说redis能够快速执行
-
大多数请求都是纯内存操作(非常快)
li>
-
非阻塞IO - IO多路复用
采用单线程,避免了不必要的上下文切换和竞争条件
redis的内部实现
内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能很差。redis为特殊的场景选择了合适的技术方案。
Redis关于线程安全问题
redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。
使用redis有哪些好处?
-
速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
-
支持丰富数据类型,支持string,list,set,sorted set,hash
-
支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
-
丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
redis相比memcached有哪些优势?
-
memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
-
redis的速度比memcached快很多
-
redis可以持久化其数据
-
Redis支持数据的备份,即master-slave模式的数据备份。
-
使用底层模型不同,它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
-
value大小:redis最大可以达到1GB,而memcache只有1MB
Redis主从复制
过程原理:
-
当从库和主库建立MS关系后,会向主数据库发送SYNC命令
-
主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来
-
当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis
-
从Redis接收到后,会载入快照文件并且执行收到的缓存的命令
-
之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致
缺点:所有的slave节点数据的复制和同步都由master节点来处理,会照成master节点压力太大,使用主从从结构来解决
redis两种持久化方式的优缺点
-
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
-
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
-
Redis 还可以同时使用 AOF 持久化和 RDB 持久化。当redis重启时,它会有限使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更加完整
-
RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集。 这种文件非常适合用于进行备份: 比如说,你可以在最近的 24 小时内,每小时备份一次 RDB 文件,并且在每个月的每一天,也备份一个 RDB 文件。 这样的话,即使遇上问题,也可以随时将数据集还原到不同的版本。
-
RDB 非常适用于灾难恢复(disaster recovery):它只有一个文件,并且内容都非常紧凑,可以(在加密后)将它传送到别的数据中心,或者亚马逊 S3 中。
-
RDB 可以最大化 Redis 的性能:父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。
-
RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快
Redis 常见的性能问题都有哪些?如何解决?
-
Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。
-
Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
-
Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。
-
Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内
redis 提供 6种数据淘汰策略
-
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
-
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
-
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
-
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
-
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
-
no-enviction(驱逐):禁止驱逐数据
我有一个微信公众号,经常会分享一些Java技术相关的干货;如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。
Docker步步实践
NZLa-1628214624253)]
[外链图片转存中…(img-MENcuj57-1628214624255)]
[外链图片转存中…(img-OIlRBFac-1628214624257)]
[外链图片转存中…(img-CBTYyj2N-1628214624258)]
[外链图片转存中…(img-iOYnutgi-1628214624259)]
[外链图片转存中…(img-E8USk7qF-1628214624260)]
[外链图片转存中…(img-Ja7aBPm8-1628214624261)]
[外链图片转存中…(img-jyAGosyZ-1628214624261)]
[外链图片转存中…(img-oDXhiDol-1628214624262)]
[外链图片转存中…(img-gUkw3UYB-1628214624263)]