超星集团武汉研发中心面试
1. 谈实习经历做了什么
2. 说一下图片的分类
(问题的内容是图片,应该不叫分类,应该说每次传图片给图片一个type)
3. 阿里云存图片的失效时间安全策略
阿里云存储的图片失效时间安全策略可以通过以下几个方面来实现:
- 设置图片的过期时间:在上传图片到阿里云存储时,可以设置图片的过期时间,即使图片的链接泄露也会在一定时间后自动失效。在创建Bucket时可以选择自定义“生命周期规则”来配置文件的过期时间。可以设置过期天数,例如设置为30天,就意味着该文件将在30天后被删除。
- 限制图片的访问权限:在阿里云存储中,可以通过访问权限策略来限制图片的访问权限。例如,可以将某个Bucket设置为私有,只有拥有相应权限的用户才能访问该Bucket中的图片。如果某个图片的访问权限设置为私有,则即使图片的链接泄露也无法被访问。
- 使用防盗链功能:防盗链功能是阿里云存储提供的一种保护图片资源的方式。通过设置防盗链规则,只有符合规则的请求才能访问该Bucket中的图片,从而避免了恶意请求对图片资源的盗用。例如,可以设置只允许指定的域名或IP地址访问该Bucket中的图片。
- 定期更换图片链接:即使图片的链接泄露,通过定期更换图片链接也可以保证图片资源的安全性。例如,可以在一定的时间间隔内更换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 "北京市%";
解释Explain得到的结果
type
反应查询语句的性能
我们主需要注意一个最重要的的 type
的信息很明显地体现出是否用到了索引:
type
结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到 range
级别,最好能达到 ref
级别,否则就可能出现性能问题。
possible_keys
: SQL查询时用到的索引。
可以看到,没加索引时,possible_keys
的值为 NULL
,加了索引后的值为 address
,即用到了索引address
(索引默认为(column_list)中的第一个列的名字).
key
显示SQL实际决定查询结果使用的键(索引)。如果没有使用索引,值为NULL
可以看到,没加索引时,key
的值为 NULL
,加了索引后的值为 address
,即决定查询结果用到了索引address
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