25.整理mysql和Redis

本文深入探讨了SQL中的聚合函数及连接类型,解释了SQL注入的概念及其预防措施,并详细阐述了MySQL性能优化的方法。此外,还介绍了Redis的基础知识、使用场景及优化策略,包括其在高并发读写和数据缓存方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sql中的聚合函数

  • avg:平均值
  • count:个数
  • max:最大值
  • min:最小值
  • sum:列的和

sql左连接和右连接的区别

  • 左连接:左表为基准查询,左表数据会全部显示出来,右表如果和左表匹配的数据显示相应字段,不匹配显示null
  • 右连接:与左连接相反
  • 全连接:先以左表进行左连接,再以右表进行右连接
  • 内连接:显示表之间有连接匹配的所有行

sql注入是什么

通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句:select * from user where username = “admin” or “a” = “a”时,sql语句恒成立,参数username毫无意义

防止的方式:预编译语句,mybatis的#

mysql性能优化

  • 当只要一行数据时使用limit 1
  • MyISAM适用于一些大量查询的应用,但对于有大量写功能的应用不是很好,MyISAM对于select count(*)这类操作是超级快的,InnoDB的对于一些小的应用会比MyISAM还慢,但是支持“行锁”,所以在写操作比较多的时候会比较优秀,并且它支持事务
  • 使用not exists(可以使用索引)代替not in(不可以使用索引)
  • 查询时建立索引

事务是什么?

一组查询要么全部执行成功,要么全部执行失败.

事务的四大特征:ACID,原子性,一致性,隔离性,持久性

事务的四种隔离级别:读未提交,读已提交(解决脏读),可重复度(解决不可重复读),串行化(解决幻读);

where子句可以对字段进行null值判断吗?

可以,select id from t where num is null也是可以的,但是最好不要给数据库留null,null也会占用空间

select * from admin left join log on admin.admin_id = log.admin_id where log.admin_id>10 如何优化?

应该使用小结果驱动大结果, select * from (select * from admin where admin_id>10) T1 left join log on T1.admin_id =log.admin_id left join 左边表结果尽量小如果有条件应该放到左边先处理, right join同理反向, 同时尽量把牵涉到多表联合的查询拆分多个 query(多个连表查询效率低,容易到之后锁表和阻塞

一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几

一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的ID是8;但是如果重启MySQL的话,这条记录的ID是6。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。
但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是8。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失
 

char和varchar的区别是什么

char(n) :固定长度类型,比如订阅 char(10),当你输入"abc"三个字符的时候,它们占的空间还是 10 个字节,其他 7 个是空字节。优点:效率高;缺点:占用空间;适用场景:存储密码的 md5 值,固定长度的,使用 char 非常合适。

varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。

所以,从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适,二者使用需要权衡。

float和double的区别是什么

  • float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。
  • double 最可可以存储 16 位的十进制数,并在内存中占 8 字节

Mysql的索引是怎么实现的

  • 索引是满足某种特定查找算法的数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
  • 具体来说 MySQL 中的索引,不同的数据引擎实现有所不同,但目前主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的

怎么验证 mysql 的索引是否满足需求

使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求

Mysql的常用引擎

InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。

MyIASM 引擎:MySQL 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

说说行锁和表锁

MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。

  • 表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
  • 行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。

说说乐观锁和悲观锁

  • 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
  • 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。

数据库的乐观锁需要自己实现,在表里面添加一个 version 字段,每次修改成功值加 1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁

mysql问题排查都有哪些手段

  • 使用 show processlist 命令查看当前所有连接信息。
  • 使用 explain 命令查询 SQL 语句执行计划。
  • 开启慢查询日志,查看慢查询的 SQL。

如何做mysql的性能优化

  • 为搜索字段创建索引。
  • 避免使用 select *,列出需要查询的字段。
  • 垂直分割分表。
  • 选择正确的存储引擎

Redis是什么 使用场景 功能

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

  • 数据高并发的读写
  • 海量数据的读写
  • 对扩展性要求高的数据

数据缓存功能 分布式锁的功能 支持数据持久化 支持事务 支持消息队列

Redis为什么是单线程的

因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。而且单线程并不代表就慢 nginx 和 nodejs 也都是高性能单线程的代表

缓存穿透是什么 怎么解决

指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。最简单粗暴的方法如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟

Redis支持的数据类型有哪些

string、list、hash、set、zset (bitmap通过最小的单位bit来进行0或者1的设置,表示某个元素对应的值或者状态 geo地理位置 hyperloglog概率)

jedis和redission有哪些区别

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。

Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上

如何保证缓存和数据库数据的一致性

  • 合理设置缓存的过期时间。
  • 新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。

Redis持久化的方式

  • RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
  • AOF(Append Only File):每一个收到的写命令都通过write函数追加到文件中。

Redis如何实现分布式锁

  • Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。
  • 占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁

Redis分布式锁的缺陷

Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题

Redis如何做内存的优化

  • 尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。
  • 比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面

Redis的淘汰策略

  • lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
  • ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
  • random:从已设置过期时间的数据集中任意选择数据淘汰。
  • no-enviction(驱逐):禁止驱逐数据

Redis常见的性能问题

  • 主服务器写内存快照,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以主服务器最好不要写内存快照。
  • Redis 主从复制的性能问题,为了主从复制的速度和连接的稳定性,主从库最好在同一个局域网内
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值