mysql是关系型数据库 redis是kv键值存储数据库 跨平台的非关系型数据库
redis五大数据类型 字符串 set集合 有序集合 列表 hash散列
redis-cli 进去后ping 看是否服务启动
可以远程登录redis-cli -h host -p port -a password
事务 multi 开始 exec执行
auth "123456" 密码验证连接到redis服务
info看服务器的统计信息
mysql是关系型数据库,遵循aicd四个原则,存储在磁盘,数据是持久化的,主要用于复杂查询,事务处理和数据完整性应用,比如金融方面
redis是kv键值对存储系统,可以存储不同数据类型,存储在内存,读写速度快,但是需要额外的持久化配置防止数据丢失,可以处理大量并发请求且快速响应,用于实时分析
数据持久化:
rdb dump.rdb redis.conf配置文件中写入save 300 10 300s内进行了10次操作就写入rdb文件中进行持久化保存 flushall或者退出都会触发rdb规则
对数据完整性要求不高 因为需要一定的时间间隔来完成操作,如果宕机了,最后一次修改的数据就没有了
redis单独fork创建一个子进程进行持久化,先将数据写入到一个临时文件dump.rdb中,待持久化过程结束后,用这个临时文件替换上次持久化好的文件,主进程不进行任何io操作,有极高的性能,适合大规模数据恢复,比较高效
AOF 默认是rdb 开启这个要修改配置文件 appendonly no 换行写appendonly.aof文件名
之后重启服务 把所有的操作步骤追加到文件
如果写入了其他内容,重启时候会失败,redis-check-aof --fix appendonl.aof修复文件
每次修改都会同步,文件完整性更好,每秒同步一次,最多丢失一秒的数据,服务重启时会执行文件里的命令来恢复数据
MVCC机制 多版本并发控制:保证数据一致性,为每个事务生成一个唯一的时间戳,并为每个数据行保存多个版本,从而允许多个事务同时读取和写入数据,不会相互干扰
- 事务时间戳:每个事务开始时,系统为其分配一个唯一的事务 ID。
- 数据行版本:每行数据都有一个创建时间和删除时间(事务 ID)。
- 读取操作:读取操作只看到在其开始时间之前提交的数据版本。
- 写入操作:写入操作生成新的数据行版本,并标记旧版本为删除。
- 提高并发性能:允许多个事务同时读取和写入数据,减少锁冲突。
- 减少锁竞争:读操作不需要加锁,写操作只需要加行锁。
select * from emp where salary<5000
union all
select * from emp where age>20;
直接连接 union去重 上下需要字段数一致字段类型也需要
select * from emp where id in (select id from dept where name = '销售' or name = '市场部')
select * from emp where salary > all(select salary from emp where dept_id=(select id from dept where name="财务部")) 用any 满足任意一人 some 也可以
子表查询 select * from where (job,salary) in (select job,salary from emp where name = "xfb" or name='psl'); 子查询返回的是表时用In
all 的意思:子查询返回的所有结果都需要满足
CREATE TABLE salgrade (
grade INT PRIMARY KEY,
losal DECIMAL(10, 2),
hisal DECIMAL(10, 2)
); 薪资等级 等级 下限 上限
INSERT INTO salgrade (grade, losal, hisal) VALUES (1, 700.00, 1200.00);
INSERT INTO salgrade (grade, losal, hisal) VALUES (2, 1201.00, 1400.00);
INSERT INTO salgrade (grade, losal, hisal) VALUES (3, 1401.00, 2000.00);
INSERT INTO salgrade (grade, losal, hisal) VALUES (4, 2001.00, 3000.00);
INSERT INTO salgrade (grade, losal, hisal) VALUES (5, 3001.00, 9999.00);
select @@autocommit
set @@autocommit=0手动提交
索引:b+tree hash r-tree full-text
b-tree
b+tree 所有的叶节点都会显示在最下面 所有数据都会chu现在叶子节点 叶子节点形成了一个双向链表
hash索引效率高 但是只能对等比较
相对于二叉树,层级更少 搜索效率高 而相对于叶子节点和非叶子节点,都会保留数据,这样导致一页中存储的键值减少,指针跟着减少,,要保留更多数据就要郑家树的高度,导致性能降低
聚集索引:先是主键 再是第一个非空唯一索引 再自动创建一个隐式的主键列 数据表的存储顺序与索引的顺序保持一致
聚集索引和二级索引区别
聚集索引的叶子节点不仅存储索引列的值,还存储该行的所有数据,整行记录,由于叶子节点包含了完整的数据行,所以不需要额外进行回表操作.
每张表只能有一个聚集索引,所以数据的物理存储只能有一种顺序。数据和索引一起存储,查询时只需要找到对应得叶子节点就可以获取完整得行数据,查询性能非常高。
占用空间大,插入和更新成本高,可能需要哟东大量数据来保持物理排序,从而导致性能开销 适用于主键查询速度快 范围查询(order by batween)
二级索引是非聚集索引,数据物理存储顺序与索引顺序无关,存储索引列得值,和聚集索引得主键值,先根据查询条件再二级索引树中找到匹配得索引列,然后通过存储再叶子节点中得主键值回到聚集索引中找到完整得数据行,回表查询,表中可以创建多个二级索引,以加速不同列上得查询,回表查询:由于叶子节点只存储索引列和主键值,要回表查询,空间占用小 非主键列查询
create [unique|fulltext] index index_name on table_name (index_col_name,...)
show index from table_name
drop index index_name on table_name
sql性能优化
sql执行频率 看增删改查频率 show [session|global] status 看服务器状态信息 可以查看频率 session 当前会话 查询优化
MariaDB [test]> show global status like 'COM_______';7个字符
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_binlog | 0 |
| Com_commit | 0 |
| Com_delete | 0 |
| Com_insert | 3 |
| Com_repair | 0 |
| Com_revoke | 0 |
| Com_select | 67 |
| Com_signal | 0 |
| Com_update | 0 |
| Com_xa_end | 0 |
+---------------+-------+
慢查询日志:记录了所有执行时间超过指定参数(long_query_time 秒默认10)的所有sql语句日志 /etc/my.cnf配置打开 查看然后定位效率低的语句
slow_query_log =1
long_query_time=2(执行时间超过两秒就视为慢查询,记录慢查询日志)
查看/var/lib/mysql/localhost-slow.log
show variables like 'slow_query_log';看慢查询日志情况
MariaDB [test]> select @@have_profiling;
+------------------+
| @@have_profiling |
+------------------+
| YES |
+------------------+ 告诉我们sql语句时间耗费在哪
set profileing=1;打开
show profiles 可以看当前sql语句的耗时
show profile (cpu) for query query_id;
再select语句前面加上desc或者 explain 可以获取Mysql如何执行select语句信息,包括执行过程中连接和连接的顺序
id值相同按顺序执行 id不同,谁大谁优先
type字段重点关注 null const eq-ref ref index all
\G让输出结果转换为竖向显示
创建索引也是构建b+tree树结构 加上索引可以加快查询效率
索引使用:
1.最左前缀法则 最左边的必须存在 中间不能跳过索引 不满足的话会走全表扫描索引不会生效 跳过的话会部分失效(后面的索引不生效) 索引位置随便
2.范围查询 前面的索引使用了范围查询(< >) 后面的索引会失效
explain select * from tb_user where professions='软件工程' and age >10 and status=10;
使用<= >=可以避免 尽量不用< >
3.索引列不能运算操作 否则索引会失效
select * from tb_user where substring(phone,10,2)='15'; 查phone从10个字符开始查找两个 最后索引失效了 因为使用了运算 是走的全表查询
4.索引列是字符型 不加'' 索引列会失效
5.模糊查询 尾部匹配不失效 头部使用会失效
select * from tb_user where profession like '%工资' 失效
select * from tb_user where profession like '工资%' 可用
- or连接条件
or 前的条件中列有索引,后面的列没有索引,所涉及到的索引都不会呗用到 直接全表查询
8.数据分布影响 Mysql评估使用索引会比表慢 就不适用索引 看查询结果大部分符合
9.sql提示 use index ignore force index
10.前缀索引 select sount(distinct substring(email,1,10))/count(*) from tb_user;
看比值,为1最好 就不会重复 逐步减少选取字段 结果为1的最小数 减少索引体积
create index id_index_5 on tb_user(email(5))
11.单列索引
sql优化
批量插入:减少与数据库交互
手动提交事务 最后统一提交 也是减少交互
主键顺序插入
大批量插入数据 使用load
mysql --local-infile -uroot -p
set global local_infile =1
load data local infile '/root/sql.log' into table 'tb_user' fileds terminated by ',' lines terminated by '\n'
页合并 Mysql会自己看数据页 超过一半会合并 默认50%
主键设计原则:尽量短 尽量不修改主键
limit 优化 :覆盖索引+子查询
select * from emp where sal > 1500
intersect 交集运算 minus 查询结果差集
列的类型,顺序,数量要一致
select * from emp where deptno = 20;
create tablespace 表空间的名称 drop
datafile '文件的路径'
size 初始化大小100m
autoextend on
next 每次扩展的大小;10m
create user 用户名
identified by 密码
default tablespace 表空间的名称;
grant 系统权限列表 to 用户名;
或者
grant 实体权限列表 on 表名称 to 用户名;
系统权限分类:(系统权限只能由DBA用户授出)
DBA:拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
CONNECT:拥有Connect权限的用户只可以登录Oracle,不可以创建实体,不可以创建数据库结构。
实体权限分类:select、update、insert、alter、index、delete、all
grant all on emp to zhangsan
alter user zhangsan identified by '123456'
number(p,s)有效数据总位数 精确到多少位
复制表: create table emp_copy as select * from emp;
create sequence 序列名称
start with 从几开始
increment by 每次增长多少
[maxvalue 最大值] | nomaxvalue
[minvalue 最小值] | nominvalue
cycle | nocycle --是否自动循环
[cache 缓存数量] | nocache;