MySQL中有哪些重要的日志文件?
错误日志:
记录MySQL服务器运行过程中的错误信息。
查询日志(General Log):
记录数据库执行的所有命令。
慢查询日志:
记录执行时间超过预设阈值的查询语句。
redo log(重做日志):
用于在系统崩溃时恢复未提交的数据。
undo log(回滚日志):
用于事务回滚时恢复数据。
bin log(二进制日志):
记录所有数据库表结构变更和数据修改操作,用于复制和数据恢复。
redo log和binlog的区别是什么?
redo log:
主要用于MySQL异常重启后的一种数据恢复手段,确保了数据的一致性。它是循环写的,只记录未刷盘的日志。
binlog:
记录了所有数据库表结构变更和数据修改操作,是追加写的,保存的是全量的日志。它主要用于复制、数据恢复和审计。
SQL注入是什么,如何预防?
SQL注入是一种攻击方式,允许攻击者通过网站输入SQL语句,可能破坏整个数据库或提取敏感信息。通过使用预处理语句与参数化查询、输入验证和转义特殊字符来预防。
1.(简单又有效的方法)PreparedStatement
采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。
使用好处:
(1).代码的可读性和可维护性.
(2).PreparedStatement尽最大可能提高性能.
(3).最重要的一点是极大地提高了安全性.
2.使用正则表达式过滤传入的参数
3.字符串过滤
4.jsp中调用该函数检查是否包函非法字符
5.JSP页面判断代码:
下面是在开发过程中可以避免 SQL 注入的一些方法。
1.避免使用动态SQL 避免将用户的输入数据直接放入 SQL 语句中,最好使用准备好的语句和参数化查询,这样更安全。
2.不要将敏感数据保留在纯文本中 加密存储在数据库中的私有/机密数据,这样可以提供了另一级保护,以防攻击者成功地排出敏感数据。
3.限制数据库权限和特权 将数据库用户的功能设置为最低要求;这将限制攻击者在设法获取访问权限时可以执行的操作。
4.避免直接向用户显示数据库错误 攻击者可以使用这些错误消息来获取有关数据库的信息。
MySQL用户管理的最佳实践是什么?
包括最小权限原则、定期审查用户权限、强化密码和禁止使用根账户进行功能操作。
如何使用EXPLAIN分析sql语句的性能?
1)、id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询。
2)、select_type列常见的有:
3)、table
显示的查询表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null
4)、type
依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引
A:system:表中只有一行数据或者是空表,且只能用于myisam和memory表。如果是Innodb引擎表,type列在这个情况通常都是all或者index
B:const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描
C:eq_ref:出现在要连接过个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引,且必须为not null,唯一索引和主键是多列时,只有所有的列都用作比较时才会出现eq_ref
D:ref:不像eq_ref那样要求连接顺序,也没有主键和唯一索引的要求,只要使用相等条件检索时就可能出现,常见与辅助索引的等值查找。或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找也会出现,总之,返回数据不唯一的等值查找就可能出现。
E:fulltext:全文索引检索,要注意,全文索引的优先级很高,若全文索引和普通索引同时存在时,mysql不管代价,优先选择使用全文索引
F:ref_or_null:与ref方法类似,只是增加了null值的比较。实际用的不多。
G:unique_subquery:用于where中的in形式子查询,子查询返回不重复值唯一值
H:index_subquery:用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。
I:range:索引范围扫描,常见于使用>,
J:index_merge:表示查询使用了两个以上的索引,最后取交集或者并集,常见and ,or的条件使用了不同的索引,官方排序这个在ref_or_null之后,但是实际上由于要读取所个索引,性能可能大部分时间都不如range
K:index:索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
L:all:这个就是全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。
5)、possible_keys
查询可能使用到的索引都会在这里列出来
6)、key
查询真正使用到的索引
7)、key_len
用于处理查询的索引长度
8)、ref
如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func
9)、rows
这里是执行计划中估算的扫描行数,不是精确值
10)、extra
MySQL服务器的默认端口是什么?
3306
三大范式是什么?
第一范式:字段不可分;
第二范式:有主键,非主键字段依赖主键;
第三范式:非主键字段不能相互依赖
日常工作中应该怎么优化SQL?
1.优化表结构
1.1尽量使用数字型字段
若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
1.2尽可能的使用 varchar 代替 char
变长字段存储空间小,可以节省存储空间。
1.3当索引列大量重复数据时,可以把索引删除掉
2.优化查询
应尽量避免在 where 子句中使用!=或<>操作符
应尽量避免在 where 子句中使用 or 来连接条件
任何查询也不要出现select *
避免在 where 子句中对字段进行 null 值判断
3.索引优化
对作为查询条件和 order by的字段建立索引
避免建立过多的索引,多使用组合索引
对慢sql如何优化?
分析语句,是否加载了不必要的字段/数据
分析 SQL 执行句话,是否命中索引等
如果 SQL 很复杂,优化 SQL 结构
如果表数据量太大,考虑分表
InnoDB中的B+Tree特性带来的优势?
它是B Tree的变种,B Tree能解决的问题它都能解决,B Tree能解决的两大问题(每个节点存储更多的关键字,路数更多)
扫库、扫表的能力更强(如果我们要进行全表扫描,只需要遍历叶子节点就可以了,不需要遍历整个B+Tree拿到所有的数据)
B+Tree的磁盘读写能力相对B Tree来说更强(根节点和枝节节点不保存数据区,所以一个节点可以保存更多关键字,一次磁盘加载的关键字更多)
排序能力更强(因为叶子节点上有下一个数据区的指针,数据形成了链表)
效率更加稳定(B+Tree永远是在叶子节点拿到数据,所以IO次数稳定)