数据持久化 -- 前车之覆
[toc]
varchar字段排序、求和排序varchar字段(里面装的本来就是数字),user_age字段是varchar类型,加0即可,这是最简单的方式,还有些别的字符类型还有对应的转化方法
123select user_name,user_age from user order by user_age+0 asc;select sum(user_age+0) from user;
timestemp设置默认值两种方式,一种是设置为该字段最小值(1970-01-01 08:00:01 ~ 2038-01-19 11:14:07),这里不推荐设置为0000-00-00 00:00:00,不是所有版本都兼容这个值;第二种是当前时间CURRENT_TIMESTAMP
12create_at timestamp null default '1970-01-01 08:00:01' comment 'test'create_at timestamp null default CURRENT_TIMESTAMP comment 'test ...
数据持久化 -- 字段类型详解
数值MySQL数值类型分为两类,整数和浮点数
整数整体来说就是根据实际使用的时候尽量选内存占用最小的
tinyint:1字节,(-128,127)基本上用来表示状态的字段适合用这个类型
smallint:2字节,范围是(-32768,32767)
mediumint:3字节,(-8388608,8388607)
int、integer:4字节,(-2147483648,2147483647)
bigint:8字节,范围大到无法想象
对于上面的这些整数类型特性上基本一致只是能存储的值不同,最常见的问题是int(2)和int(3),这里的2和3只是一个宽度显示器,并不会影响到数值的存储;例如int(2)同样可以完整的存储100,只是只能展示两位
再说一下unsigned和zerofill两个关键字
unsigned:表示无符号,不表示负数,这样字段的内存中就能多出一位来存储数值,比如修饰tinyint的时候它的范围变成了0-255
zerofill:用0来真补输出的值,且当这个关键字修饰时也会自动出现unsigned关键字效果
浮点数
float:float(7,3)表示总长度不超 ...
数据持久化 -- 操作命令
服务启动与登录12345# Linux上mysql安装后都能在/etc/init.d/下找到mysqld,安装的方法不同会导致命令行中不一定能直接找到mysql命令,可以添加到别名中去/etc/init.d/mysqld start# 登录,回车后输入密码mysql -h localhost -P part -u username -p
SQL(Structured Query Language 结构化查询语言)语句DDL(Data Definition Language)数据定义语言查看所有数据库1show database;
切换数据库1use database;
创建数据库1create database[if not exists] newDBName;
删除数据库1drop database dbName;
修改数据库编码1alter database dbName character set utf8;
查看所有数据表1show tables;
创建表123456create table tableName( id int primary key a ...
数据持久化 -- 数据库优化
明确要查找的字段,别用select *尽量用上覆盖索引
遇到比较长的字符串时,考虑使用前缀索引或者hash索引
尽量定义自增长的主键,如果用一个唯一的业务数据来当主键的时候,如果不是int类型,普通索引的叶子节点存储它的时候会占用更多的空间
数据持久化 -- 数据库性能分析命令
一、查看数据库表占用空间大小1select TABLE_NAME,concat(truncate((DATA_LENGTH+INDEX_LENGTH)/1024/1024,2),'M'),TABLE_ROWS FROM information_schema.TABLES where TABLE_SCHEMA='ins_rank'
上面的语句会依次输出ins_rank数据库中表对空间占用的情况,单位是M,来一一解释关键字和函数的意义
函数
concat函数–联合字段
12<!--这个函数的作用就是将两个字段拼接到一个字段中做显示-->select concat(10,'M') as lenge
round()–四舍五入,虽然这里没有用到,还是可以留个印象,MySQL里面有这么个函数
12select round(column_name,decimals) from table_name# 这里decimals表示精确度,返回小数点后几位
truncate()–截取字段函数,案例中使用了truncate就没有使用rou ...
数据持久化 -- 索引、分表
索引
mysql主键是默认会创建索引的,外键不清楚,现在用得不多了
数据量超过300的表应该有索引
经常与其他表进行连接的表,在连接字段上应该建立索引
经常出现在Where子句中的字段,特别是大表的字段,应该建立索引
索引应该建在选择性高的字段上,即重复度低(能过滤80%以上的数据时就适合创建索引)
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替
频繁进行数据操作的表,不要建立太多的索引
删除无用的索引,避免对执行计划造成负面影响
查看索引方法
失效场景
负向条件查询(如何实现not in)
前导模糊查询
函数
分区
分区索引建立
分区条件
Redis入门简介
1.特性
速度快,基于内存,能达到10w QPS(每秒查询速度)
基于键值对,它的value中支持5种数据结构
单线程模式,天生线程安全
支持持久化
主从复制、高可用、分布式、水平扩容
2.应用场景
缓存:提供键值过期时间,提供最大内存控制和内存溢出后的淘汰策略
排行榜:通过列表和有序集合很方便构建各种排行榜系统
计数器:设置超时时间来实现限流?
消息队列:这个还是比不上专业的消息队列的
3.安装配置
单机的安装就是下载安装没有什么好说的,使用Docker安装最为方便
主从配置这里不详细记录,参考:文章
安装mac
到官网下载压缩包
将压缩包解压到/usr/local目录下:/usr/local/redis-5.0.512345678910# 安装cd redis-5.0.5makesudo make install# 启动,启动之前修改一下整个Reddit文件夹的权限,不然用起来不方便sudo chmod 777 redis-5.0.5redis-server redis.conf# 关闭redis-cli shutdown
Docker123456789docker p ...
Redis内存模型
概述
内容测试基于Redis版本:7.0.10
参考博客:深入学习Redis(1):Redis内存模型
一、内存统计和分类1.1.1 内存统计命令注意info这个命令可以输出Redis服务相关的所有信息
12345678910127.0.0.1:6379> info memory# Memoryused_memory:1108392used_memory_human:1.06Mused_memory_rss:4489216used_memory_rss_human:4.28M...mem_fragmentation_ratio:4.13mem_allocator:jemalloc-5.2.1...
used_memory和used_memory_human是同一个数据表示Redis分配器的内存总量(包括虚拟内存),human只是便于人查看
used_memory_rss表示Redis服务从系统申请占用的真实内存(不包括虚拟内存),包括了服务自身的内存开销,而used_memory相当于业务占用内存
mem_fragmentation_ratio:内存碎片比率,该值是use ...
Redis实现原理
SDS把SDS单独提一下,所有的用户数据在Redis中都是使用SDS进行存储的,之前内存模型中有详细说明过
Stringstring是Redis中最简单的键值对存储方式,使用字典进行实现,基于Hash表,当往Redis中添加一个键值对的时候,通过key计算出的hash值被映射到一个Hash表上(Hash居然是一个单向链表),由于是Hash值做的映射,会发生冲突,冲突的时候通过链表把数据(key)依次进行存储
123456789101112131415161718192021222324252627282930313233343536373839struct dict { dictType *type; // 记录类型,用于创建多类型的字典,不清楚具体作用 dictEntry **ht_table[2]; // Hash表,这里有两个Hash表,正常只使用第一个,当第一个需要重做Hash时临时使用第二个 unsigned long ht_used[2]; // 之前版本有个独立的dictht结构体用来存储Hash表的统计信息,估计现在存在这个地方了 ...
Redis应用场景
特性:
所有的命令过来之后,Redis会放入一个任务队列中,挨个执行,所以Redis天生线程安全(NIO实现单线程速度优化)
访问速度快,Redis单服务器的并发大概是几万(普通服务器)
string
单值缓存
商品库存 商品ID做为key,库存数量作为value
对象缓存
仍然使用set的方式,将对象的主键提出来作为key,将对象转换为json格式作为value
mset 批量进行存储操作,将对象的主键和对象的某一个属性比如user:1:name作为key,将对象改属性的值作为value
缺点:set的操作会复杂一点,从直觉上没有json的方式异动
有点:取用和修改的时候更灵活
分布式锁
场景:有两个服务器中运行着减库存的方法,该方法的结构
查询库存
减库存
把减完的数据存储回数据库
实现:使用setnx命令
setnx命令相对于set命令会多一个判断逻辑,判断要设置的key在Redis中目前是否存在,如果不存在则将key和value进行正常的保存操作并返回1,如果已经存在不会对value进行更新并返回0
根据setnx的特性,在上面的流程中,在查询库存之前往Re ...