超星集团武汉研发中心面试题

文章涵盖了数据库的索引类型、MySQL的分页查询、Redis的使用场景、Java集合类List与ArrayList、LinkedList的区别、Linux的常用命令、以及设计模式中的适配器模式和分布式session处理。还探讨了如何处理高并发场景,包括系统拆分、缓存、消息队列、分库分表、读写分离等策略。

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

超星集团武汉研发中心面试

1. 谈实习经历做了什么

2. 说一下图片的分类

(问题的内容是图片,应该不叫分类,应该说每次传图片给图片一个type)

3. 阿里云存图片的失效时间安全策略

阿里云存储的图片失效时间安全策略可以通过以下几个方面来实现:

  1. 设置图片的过期时间:在上传图片到阿里云存储时,可以设置图片的过期时间,即使图片的链接泄露也会在一定时间后自动失效。在创建Bucket时可以选择自定义“生命周期规则”来配置文件的过期时间。可以设置过期天数,例如设置为30天,就意味着该文件将在30天后被删除。
  2. 限制图片的访问权限:在阿里云存储中,可以通过访问权限策略来限制图片的访问权限。例如,可以将某个Bucket设置为私有,只有拥有相应权限的用户才能访问该Bucket中的图片。如果某个图片的访问权限设置为私有,则即使图片的链接泄露也无法被访问。
  3. 使用防盗链功能:防盗链功能是阿里云存储提供的一种保护图片资源的方式。通过设置防盗链规则,只有符合规则的请求才能访问该Bucket中的图片,从而避免了恶意请求对图片资源的盗用。例如,可以设置只允许指定的域名或IP地址访问该Bucket中的图片。
  4. 定期更换图片链接:即使图片的链接泄露,通过定期更换图片链接也可以保证图片资源的安全性。例如,可以在一定的时间间隔内更换Bucket中的图片链接,从而避免泄露后被滥用的风险。

综上所述,阿里云存储提供了多种方式来保护图片资源的安全性,可以根据具体的需求和情况选择合适的安全策略来保护图片资源。

4.MySQL的分页用的什么

方法1: 直接使用数据库提供的SQL语句

—语句样式: MySQL中,可用如下方法:

SELECT * FROM 表名称 LIMIT M,N

—适应场景: 适用于数据量较少的情况(元组百/千级)。

—原因/缺点: 全表扫描,速度会很慢 且 有的数据库结果集返回不稳定(如某次返回1,2,3,另外的一次返回2,1,3)。Limit限制的是从结果集的M位置处取出N条输出,其余抛弃。

方法2: 建立主键或唯一索引, 利用索引(假设每页10条)

—语句样式: MySQL中,可用如下方法:

复制代码 代码如下:

SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) LIMIT M

—适应场景: 适用于数据量多的情况(元组数上万)。

—原因: 索引扫描,速度会很快。有朋友提出因为数据查询出来并不是按照pk_id排序的,所以会有漏掉数据的情况,只能方法3。

方法3: 基于索引再排序

—语句样式: MySQL中,可用如下方法:

SELECT * FROM 表名称 WHERE id_pk > (pageNum*10) ORDER BY id_pk ASC LIMIT M

—适应场景: 适用于数据量多的情况(元组数上万). 最好ORDER BY后的列对象是主键或唯一所以,使得ORDERBY操作能利用索引被消除但结果集是稳定的(稳定的含义,参见方法1)。

—原因: 索引扫描,速度会很快. 但MySQL的排序操作,只有ASC没有DESC(DESC是假的,未来会做真正的DESC,期待)。

5. 索引有多少种类型

  • 普通索引:这是最基本的索引,它没有任何限制
  • 唯一索引:与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
  • 全文索引
  • 单列索引、多列索引
  • 组合索引
1. 普通索引

这是最基本的索引,它没有任何限制

–直接创建索引
CREATE INDEX index_name ON table(column(length))
–修改表结构的方式添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
–创建表的时候同时创建索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(length))
)
–删除索引
DROP INDEX index_name ON table
123456789101112131415
2. 唯一索引

与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。

–创建唯一索引
CREATE UNIQUE INDEX indexName ON table(column(length))
–修改表结构
ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))
–创建表的时候直接指定
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
UNIQUE indexName (title(length))
);
12345678910111213
3. 全文索引(FULLTEXT)

MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。

–创建表的适合添加全文索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
FULLTEXT (content)
);
–修改表结构添加全文索引
ALTER TABLE article ADD FULLTEXT index_content(content)
–直接创建索引
CREATE FULLTEXT INDEX index_content ON article(content)
12345678910111213
4. 单列索引、多列索引

多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。

5. 组合索引(最左前缀)

平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引:

6. 如何判断语句是否有索引

使用 explain 关键字查看

例如:

SQL查询 address 为北京市的人:

explain select name, address from student where address like "北京市%";

img

解释Explain得到的结果

  1. type 反应查询语句的性能

我们主需要注意一个最重要的的 type 的信息很明显地体现出是否用到了索引:

type 结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到 range 级别,最好能达到 ref 级别,否则就可能出现性能问题。

  1. possible_keys: SQL查询时用到的索引。

可以看到,没加索引时,possible_keys 的值为 NULL,加了索引后的值为 address,即用到了索引address(索引默认为(column_list)中的第一个列的名字).

  1. key 显示SQL实际决定查询结果使用的键(索引)。如果没有使用索引,值为NULL

可以看到,没加索引时,key 的值为 NULL,加了索引后的值为 address,即决定查询结果用到了索引address

  1. rows 显示MySQL认为它执行查询时必须检查的行数

可以看到,没加索引时,rows 的值为17,即数据表student中所有数据,说明没加索引时的SQL查询是全表扫描;

加了索引后,rows 的值为6,数据库表中address以“北京市”开头的一共也就6条,SQL在执行查询操作时,一共也检查了6行,不必进行全表扫描查询,可以很容易得出结论:加索引的SQL查询性能远高于不加索引的情况。

7. 联表查询有几种

  • 内连接:查找两个表中连接字段相等的记录。

  • 外连接:

    • 左外连接:获取左表中的所有记录,即使在右表没有对应匹配的记录。
    • 右外连接:用于获取右表中的所有记录,即使左表没有对应匹配的记录。
  • 交叉连接:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。

  • 完全连接:返回两个表中的所有行

7.1、内连接

内连接通常有两种情况:

**等值连接:**查找两个表中连接字段相等的记录。

**自身连接:**就是和自己进行连接查询,给一张表取两个不同的别名,然后附上连接条件。

等值连接的写法:

--写法1:使用INNER JOIN
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A
INNER JOIN major B   
ON  A.学号=B.学号

--写法2:--省去了INNER,直接写JOIN,与INNER JOIN没有区别
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A
JOIN major B  
ON  A.学号=B.学号

--写法3: --使用WHERE,已经逐渐被淘汰
SELECT A.学号, A.姓名, A.籍贯, A.年龄, B.专业, B.班级
FROM student A, major B
WHERE A.学号=B.学号 

自身连接的写法:

--要在学生表里查询与 HH 同龄且籍贯也相同的学生信息

SELECT B.学号, B.姓名, B.性别, B.籍贯, B.年龄
FROM student A 
JOIN student B
ON A.年龄=B.年龄 AND A.籍贯=B.籍贯 AND A.姓名='HH'

7.2、左连接

获取左表中的所有记录,即使在右表没有对应匹配的记录。

写法:

--左连接:显示左表student所有记录,如右表中没有与之
--匹配的项则以NULL值代替。

SELECT A.学号, A.姓名, A.籍贯, A.年龄, B
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值