1.MySQL调优的步骤
2.MySQL常见的存储引擎InnoDB、MyISAM的区别?
(口诀)事外锁,行数聚集,适用场景
1)事务:MyISAM不支持,InnoDB支持
2)锁级别: MyISAM 表级锁,InnoDB 行级锁及**外键(有)**约束
(MySQL表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。什么意思呢,就是说对MyISAM表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作;而对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作。
InnoDB行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,InnoDB才使用行级锁,否则将使用表锁!行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源。在InnoDB两个事务发生死锁的时候,会计算出每个事务影响的行数,然后回滚行数少的那个事务。当锁定的场景中不涉及Innodb的时候,InnoDB是检测不到的。只能依靠锁定超时来解决。)
3)MyISAM存储表的总行数;InnoDB不存储总行数;
4)MyISAM采用非聚集索引,B+树叶子存储指向数据文件的指针。InnoDB主键索引采用聚集索引,B+树叶子存储数据
适用场景:
MyISAM适合: 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择, 没有事务。
InnoDB适合: 可靠性要求比较高,或者要求事务; 表更新和查询都相当的频繁, 大量的INSERT或UPDATE
3.什么是SQL注入攻击
在HTTP请求中注入恶意SQL代码,服务器构建SQL命令时,恶意SQL被一起构造,并在数据库中执行,举个例子:我们在用户登录的表单中username和password两个输入框,在username输入’ or 1=1 --(单行注释),sql拼接后就成了select id from users where username=’ ’ or 1=1 --*****,这就完全跳过了sql验证;
防止SQL注入攻击
web端进行有效性验证并限制字符串长度;
服务器端使用预编译PrepareStatement取代拼接SQL字符串。