更新特定行 1 2 3 updateusersetage=age+1whereage>18; ignore关键字 update的时候,如果一行update失败,则由于事务的特性会导致整个update操作回退, 使用ignore可以忽略本行update的失败
1 2 3 updateignoreusersetage=age+1whereage>18; 更新全部行 删除特定行 1 deletefromuserwhereusername='mao'; 删除全部行 如果想删除表中所有的行,不要使用delete,可以使用truncate table语句(原理是删除原来的表,并新建同名表)
1.1 定义数据库和实例 mysql启动 mysql会读取配置然后进行启动,若没有配置则按默认设置进行启动。配置的读取顺序为: /etc/my.cnf, /etc/mysql/my.cnf, ~/.my.cnf ,多个配置中设置了同一参数,则后者覆盖前者。
更多详细内容请阅读4.2.2.2 Using Option Files
配置文件中的datadir参数 这个参数组合定了数据库所在的路径,linux下默认为/usr/local/mysql/data, 其实它只是一个指向/opt/mysql_data/的链接
1.2 MySQL体系结构 MySQL由以下几部分组成:
连接池组件 管理服务和工具组件 SQL接口组件 查询分析器组件 优化器组件 cache组件 插件式存储引擎 物理文件 重要特点: 插件式的表存储引擎
需要注意的是: 存储引擎是基于表的, 而不是数据库的。
1.3 MySQL存储引擎 InnoDB InnoDB存储引擎设计目标为面向在线事务处理( OLTP)的应用 支持事务,行锁设计,支持外键,支持非锁定读(默认读操作不加锁) 通过使用多版本并发控制(MVCC)来获得高并发性 实现了SQL标准的4种隔离级别,默认为REPEATABLE级别 使用next-key这种策略避免幻读 提供插入缓冲(insert buffer),二次写(double write),自适应哈希索引(adaptive hash index),预读(read ahead)等高性能和高可用的功能 采用聚集(clustered)的方式对表中的数据进行存储。每张表的存储都按主键的顺序进行存放;如果没有显示的定义主键,InnoDB会为每行生成一个ROWID,并以此作为主键 省略以下存储引擎的笔记 MyISAM NDB Memory Archive Federated Maria 部分笔记参考对应的xmind文件
1.4 各个存储引擎之间的对比 1.5 连接到MySQL 与MySQL的连接,本质上是进程间同信,参考linux进程间通信的相关知识
通过TCP/IP 通过命名管道和共享内存 通过UNIX域套接字
2.1 InnoDB存储引擎概述 支持ACID事务,特点是行锁设计 支持MVCC 支持外键 提供一次性非锁定读 2.2 InnoDB存储引擎的版本 2.3 InnoDB体系结构 后台线程总览 主要作用是负责刷新内存池中的数据,保证缓冲池中的数据是最近的数据 将已修改的数据文件刷新到磁盘文件 保证异常发生时InnoDB能恢复到正常状态 内存池总览 维护所有进程/线程需要访问的多个内部数据结构 缓存磁盘上的数据,方便快速的读取,同时在对磁盘文件的数据修改之前在这里缓存 重做日志(redo log)缓冲 2.3.1 后台线程(建议先看2.3.2) 后台线程由Master Thread,I/O Thread, Purge Thread, Page Cleaner Thread 组成,详细如下
2.3.1.1 Master Thread 主要负责将缓冲池中的数据异步刷新到磁盘,保持数据的一致性,包括脏页的刷新、合并插入缓冲、UNDO页的回收等。
Master Thread总体上分两类操作,分别是每秒进行的,以及每10秒进行的。
每秒进行的操作:
日志缓冲刷新到磁盘,即使这个事务还没有提交 合并插入缓冲(可能发生)当前1秒内发生IO次数小于5则合并 当buf_get_modified_ratio_pct > innodb_max_dirty_pages时,刷新脏页到磁盘(可能发生,至多100个脏页) 如果当前没有用户活动,则切换到background loop 每10秒进行的操作:
刷新100个脏页到磁盘(可能) 合并之多5个插入缓冲(总是) 将日志缓冲刷新到磁盘 删除无用的undo页 刷新100个或者10个脏页到磁盘 Master Thread具体分为loop, background loop,flush loop, suspend loop四个循环
2.3.1.1.1 InnoDB 1.0.x版本之前 Master Thread的伪代码 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 void master_thread(){ goto loop; loop: for(int i=0; i<10; ++i){ thread_sleep(1); flush_log_buffer_to_disk(); if(last_one_second_io < 5){ merge_at_most_5_insert_buffer(); } if(buf_get_modified_ratio_pct > innodb_max_dirty_pages_pct){ flush_100_dirty_page(); } if(no_user_activity){ goto background_loop; } } if(last_ten_second_io < 200){ flush_100_dirty_page(); } merge_at_most_5_insert_buffer(); flush_log_buffer_to_disk(); full_purge(); if(buf_get_modified_ratio_pct > 0....
1. 使用set key value nx 实现锁 acquire: set key value nx , 根据返回值判断是否加锁成功 release: delete key
2. ID生成器 3. 限速器 信号量
4. 短网址实现 给网址一个递增的整数id,然后将这个十进制id转换为36进制数(0到9+26个数字) 细节上,可以给id一个偏移,使得转换后的短网址不太短 5. 实现用户登录会话 6. 使用集合实现唯一计数器 7. 打标签 (集合) 8. 点赞 (集合) 点赞:往集合里加用户 取消赞:从集合里去除用户 9. 投票 (集合) 一个集合保存赞成 一个集合保存反对 10. 社交关系 集合s1记录关注名单 集合s2记录粉丝 如果A关注了B,那么A的s1中添加B,B的s2中添加A。
同时非常方便判断是不是互相关注
11. 抽奖 srandmember
12. 共同关注与推荐关注 共同关注:sinter 推荐关注:从关注用户的关注用户的集合取交集,并随机返回 13. 反向筛选器 给商品添加多个标签 然后通过标签选多个商品 14....
intro 目录索引 第02~10章-数据结构与应用 第11章-数据库 第12章-自动过期 第13章-流水线与事务 第14章-lua脚本 第15章-持久化 第16章-发布与订阅 第17章-模块 第18章-复制 第19章-sentinel 第20章-集群 Redis应用大全
1. 字符串 1.1 为字符串键设置值 1 set key value [NX|XX] NX:key不存在时才设置。若存在,则放弃设置,并返回nil XX:key存在时才设置。若存在,设置成功后返回ok,否则不存在,返回nil。
1.2 获取字符串键的值 1 get key 1.3 GETSET: 获取旧值并设置新值 1 getset key value 如果key之前不存在,那么返回值是nil
1.4 删除键 1 del key 返回值代表操作了多少项
1.5 MSET:一次为多个字符串键设置值 1 mset key1 value1 [key2 value2] mset的意义,在于可以用其实现patch的功能,节约网络通信的重复开销
1.6 MGET:一次获取多个字符串键的值 1 MGET key [key ...] 若某个key不存在,则返回nil
1.7 MSETNX: 只在键全部不存在的情况下,一次设置多个键的值 1 MSETNX key value [key value] 若其中某个key已存在,则返回0...
11.1 SELECT:切换至指定数据库 1 select index 默认使用0号数据库,命令行不会打印出index 如果使用其他数据库,客户端命令行将会有对应的index进行标识 11.2 keys 获取数据库中与给定匹配符相匹配的全部键键名 1 SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] keys * 获取当前数据库全部键名 11.3 SCAN:以渐进的方式迭代数据库中的键 scan扫描的是数据库里的键,而不是键里的数据 一次性返回全部查询结果可能会对服务器造成巨大负担,scan就是用来解决这个问题。 scan的问题: 新增数据,新数据是否会在接下来的扫描中返回是不确定的 删除数据,删除操作发生在扫描之前,那么数据被返回了,但扫描仍旧未结束 其他数据结构对应的scan HSCAN SSCAN ZSCAN 11.4 RANDOMKEY:随机返回一个key 11.5 SORT:对键的值进行排序 默认值的数值进行排序 对字符串进行排序时,指定alpha 指定升序asc和降序desc limit, offset, count 获取外部键的值作为结果 使用外部键的值作为排序权重 指定存储的键 11.6 EXISTS:检查给定的一个或多个键是否存在 11.7 DBSIZE:获取数据库包含的键值对数量 11....
12.1 EXPIRE、PEXPIRE:设置生存时间 EXPIRE 设置秒级 PEXPIRE 设置毫秒级 为已有生存时间的键设置生存时间时,会覆盖并重新开始计时。 12.2 SET命令的EX选项和PX选项 12.3 EXPIREAT、PEXPIREAT:设置过期时间 EXPIREAT 接受一个秒级精度的UNIX时间戳 PEXPIREAT 接受一个毫秒级精度的UNIX时间戳 12.4 自动过期特性不足之处 只能对某个键设置,不能对键中某个元素进行设置
12.5 TTL、PTTL:获取键的剩余生存时间 TTL 返回值的单位是秒 PTTL 返回值的单位是毫秒