mysql+redis后端面试常问

 

Redis 5 种基本数据类型

Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。

 

mysql在表数据量很大的时候怎样安全的修改表结构

  • 使用工具pt-online-schema-change 工具
  • gh-ost 工具

 

MyISAM索引与InnoDB索引的区别?

  • InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
  • InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
  • MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
  • InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。

有哪几种索引类型
  • 1.主键索引
  • 2.唯一索引
  • 3.普通索引
  • 4.空间索引
  • 5.全文索引

核心作用:减少磁盘I/O次数,提升查询速度

聚集索引

索引与数据存放在一起,找到索引的同时也找到了数据;聚簇索引具有唯一性,一张表只有一个聚簇索引。
聚簇索引默认是主键,如果表中没有定义主键,InnoDB 会选择一个非空唯一索引代替。如果没有,InnoDB 会定义一个隐藏的 _rowid 列来作为聚簇索引。

非聚集索引

索引与数据分开存放,索引结构的叶子节点指向了数据的对应行。

左侧原则是什么?
 

什么是回表?

mysql隔离机制 ACID 特性

  • 原子性(Undo Log):事务操作要么全成功,要么全失败。
  • 一致性:事务前后数据满足完整性约束(如主键唯一)。
  • 隔离性(MVCC + 锁):通过隔离级别控制并发事务的可见性。
  • 持久性(Redo Log):事务提交后数据持久化到磁盘。

数据库优化策略:

一般索引,并且是字段递增,可以考虑设置为UNSIGNED

使用枚举代替字符串类型

整数类型
​可以使用的几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8,16,24,32,64位存储空间。尽量使用满足需求的最小数据类型。

尽量避免null
​如果查询中包含可为NULL的列,对mysql来说很难优化,因为可为null的列使得索引、索引统计和值比较都更加复杂。并且还占用额外的空间

不要使用字符串类型来存储日期时间数据
使用mysql自建类型而不是字符串来存储日期和时间

字符和字符串类型
1、char长度固定,即每条数据占用等长字节空间;最大长度是255个字符,适合用在身份证号、手机号等定长字符串
2、varchar可变长度,可以设置最大长度;最大空间是65535个字节,适合用在长度可变的属性
3、text不设置长度,当不知道属性的最大长度时,适合用text
按照查询速度:char>varchar>text


减少*的使用,只查询需要的字段

使用关联查询,代替子查询

减少在查询语句里面出现null字段的判断、否则引擎放弃索引,对全表进行扫描

如果一个访问量达到100万,选择缓存,你会选择redis还memchache?
我会选择memchache,因为它只有一种类型,key-value,而redis的类型比memchache多,
导致它的并发没有memchache好。



高访问量的网站怎么优化?
将不经常变化的数据,直接静态化。
使用redis和memcha,减少数据库的访问。
控制大文件的下载。
图片、视频服务器分离。
​禁止外部的盗链。(可以通过refer去实现)
​统计流量的使用情况。
不考虑成本,服务器可以考虑负载均衡,mysql主从复制、读写分离

redis默认有多少个库?
​16个库

怎么防止商品不会超卖、秒杀过程?
​采用redis的队列,去实现。
点击商品的时候,要将商品存入redis中
redis中的数据结构list中 rpush | lpop | lpush | rpop 实现队列的先进先出的特性
lpush:左边入队列,存入秒杀活动的商品   rpop:右边出队列,获取抢到的商品


单引号和双引号的区别?
​ 1.单引号比双引号执行速度快。
​ 2.双引号会解析变量、换行,而单引号不会。

微信支付、支付宝回调,如果在回调区间服务器崩溃了,有没有解决办法?
​ 1.确定那些单是没有收到回调。
 2.通过订单号,去查询支付宝和微信的订单状态,确定是否支付成功。


你可能感兴趣的:(2025_php面试,面试,php)