一 索引
1.1.1 在 SQL 数据库一个班级表里只记录了 100 位同学的情况,那么对该表建立索引文件的描述正确的是(不适宜,因为对少数记录的表进行索引实际上会产生不利的影响)
1.2.1 索引的好处和坏处是什么?
1> 好处.在适合的索引下,查询快.
2> 坏处.索引需要成本去维护.
1.2.2 数据库中,哪些列需要创建索引,哪些列不适合创建索引?
1> 经常作为where order by group by的列建议创建索引
2> 重复值过多的列不适合做索引
3> 经常会发生变化的列不适合做索引
1.2.3 Mysql 列出数据库___use__切换当前用户连接的数据库__库名____
1.2.4 请问以下一些查询语句是否用到该索引? 对 last_name 与 first_name 做索引
以下语句会走last_name部分索引:
SELECT * FROM CUSTOMER_MASTER WHERE last_name = 'Crane' AND first_name LIKE '%Ed';
SELECT * FROM CUSTOMER_MASTER WHERE last_name LIKE 'Crane%' ORDER BY first_name,last_name;
以下语句会走全部索引:
SELECT * FROM CUSTOMER_MASTER WHERE last_name='Crane' OR first_name='ED';
1.2.5 说说你对索引的认识(结构、对 dml 的影响、为什么提高查询性能)
索引有 B-TREE、BIT、CLUSTER 等类型。ORACLE 使用了一个复杂的自平衡 B-tree 结构;通常来说,在表上建立恰当的索引,查询时会改进查询性能。
但在进行插入、删除、修改时,同时会进行索引的修改,在性能上有一定的影响。有索引且查询条件能使用索引时,数据库会先度取索引,根据索引内容和查询条件,
查询出 ROWID,再根据 ROWID 取出需要的数据。由于索引内容通常比全表内容要少很多,因此通过先读索引,能减少 I/O,提高查询性能。
b-tree index/bitmap index/function index/patitional index(local/global)索引通常能提高 select/update/delete的性能,
会降低 insert 的速度。
二 MySQL 优化
2.1 选择
从二叉树的任一结点出发到根的路径上,所经过的结点序列必按其关键字降序排列。( C )
A 二叉排序树 B.大顶堆
C 小顶堆 D.平衡二叉树
2.2 填空
在总计函数中,传回非 NULL 值的字段数目的函数名称是: ___COUNT()___
2.3 简答
2.3.1 若果一个 sql 查询语句很长,执行速度慢,你会想到哪些优化的方法?
1> 查询不需要的记录,使用 limit 解决;
2> 多表关联返回全部列,指定 A.id, A.name, B.age;
3> 总是取出全部列,SELECT * 会让优化器无法完成索引覆盖扫描的优化。
4> 优化 count() 查询
5> 优化关联查询
6> 优化子查询(即嵌套查询)
7> 优化 GROUP BY 和 DISTINCT
8> 优化 LIMIT 分页
9> 优化 UNION 查询
2.3.2 数据库里有些数据会反复被查询,问有什么好方法提高效率?
1> 建立索引
2> 分区(如 MySQL,按时间分区)
3> 尽量使用固定长度字段和限制字段长度(如 varchar(10))
4> 增加缓冲区
5> 如果设计表的级联,不同的表存储在不同磁盘上,以增加 I/O 速度
6> 优化 sql 语句,减少比较次数
7> 限制返回条目数(mysql 中使用 limit)
2.3.3 系统中,主要的业务表。按月进行分表。7,8,9 月表分别为 tab_201707、tab_201708、tab_201709 这三个表里。表结构如下:
SQL> desc tab_201707;
Name Type Nullable Default Comments
ID NUMBER 自增
CID NUMBER Y 批次 ID
CODE VARCHER2(20) Y 特服号
CORPORATEID NUMBER 企业 ID
USERID NUMBER Y 用户 ID
请写出 SQL 语句,统计 7、8、9 三个月,每个 USERID 的记录总数
select count(id) from tab_201707 group by USERID;
select count(id) from tab_201708 group by USERID;
select count(id) from tab_201709 group by USERID;
2.3.4 什么是跨站脚本攻击,有何危害,sq|注入攻击如何防范?
XSS 跨站脚本攻击:两种情况。一种通过外部输入然后直接在浏览器端触发,即反射型 XSS;还有一种则是先把利用代码保存在数据库或文件中,
当 web 程序读取利用代码并输出在页面上时触发漏洞,即存储型 XSS。DOM 型 XSS 是一种特殊的反射型 XSS。跨站点脚本(XSS)允许攻击者通过利用因特网
服务器的漏洞来发送恶意代码到其他用户。攻击者利用跨站点脚本(XSS)攻击向那些看似可信任的链接中注入恶意代码。当用户点击了链接后,内嵌的程序将被提交
并且会在用户的电脑上执行,这会使黑客获取。
危害:前端页面能做的事它都能做。(不仅仅盗取 cookie、修改页面等)
漏洞防范
(1) 特殊字符 HTML 实体转码。最好的过滤方式是在输出和二次调用的时候进行加 HTML 实体一类的转码,防止脚本注入。
(2) 标签事件属性黑名单。特殊字符容易被绕过,所以还得加标签事件得黑名单或者白名单,这里推荐使用白名单的方式,实现规则可以直接使用正则表达式
来匹配,如果匹配到的事件不在白名单列表,就可以直接拦截,而不是过滤为空。
2.3.5 在工作中,一台线上 MySQL 数据库查询数据突然变得异常缓慢,如果交给你排查,请写出排查思路。
首先应该从系统级别来排查。先找出到底哪里慢,是特定操作慢呢,还是所有操作都慢了。
既然是突然变慢,那么就是说之前还是比较快的。自从某个特殊事件发生后,慢了下来。特殊事件一般包括:
1、程序做了修改。
2、突然有大数据量的系统访问。
3、某些不常用功能突然启用,或大量访问。
4、某些硬件出了功能性问题。
对于系统整体变慢,基本上还是先查系统日志。查最近的系统更新日志。查看磁盘剩余容量。硬件是否由异常。
2.3.6 列出您认为 sql 优化可以从哪些方面进行?
1、sql 语句的执行计划是否正常。
2、减少应用和数据库的交互次数、同一个 sql 语句的执行次数。
3、数据库实体的碎片的整理(特别是对某些表经常进行 insert 和 delete 动作,尤其注意,索引字段为系列字段、自增长字段、时间字段,
对于业务比较频繁的系统,最好一个月重建一次)。
4、减少表之间的关联,特别对于批量数据处理,尽量单表查询数据,统一在内存中进行逻辑处理,减少数据库压力(
尽量用 c 或者 c++ 进行处理,效率大大提升)。
5、对访问频繁的数据,充分利用数据库 cache 和应用的缓存。
6、数据量比较大的,在设计过程中,为了减少其他表的关联,增加一些冗余字段,提高查询性能。