一、请列举常见的mysql存储引擎
1.show engines
命令查看mysql使用的引擎,命令输出为
如果要想查看数据库默认使用哪个引擎,可以通过使用命令
SHOW VARIABLES LIKE 'storage_engine';
在mysql中,不需要在整个项目中使用一种引擎,根据不同的需求对每一个表使用不同的存储引擎,Suport列的值表示某种引擎是否可以使用:yes表示可以使用,no表示不可以使用,default表示默认的存储引擎
InnoDb存储引擎
innodb是事务型数据库的首选引擎,支持事务安全表(ACID),支持锁定和外键,mysql默认的是innodb,innodb主要特性有:
1.innodb给数据提供了提交,回滚和崩溃恢复的能力的事务安全存储引擎。在sql查询中可以自由的将innodb类型的表和其他mysql类型的表混合起来,甚至也可以在同一个查询中也可以混合
2.InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的
3.InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键
4.InnoDB被用在众多需要高性能的大型数据库站点上
myisam存储引擎
memory存储引擎
二、请列出一些msyql数据库查询优化的技巧
1.尽量避免在where句子中使用!=或<>操作符号,或者对值进行null判断,否则引擎将放弃索引而进行全盘扫描如:
select id from t where num is null,
可以在num上设置默认值0,确保表中num列没有null值,改:
select id from t where num=0
2.避免在where中使用or来连接条件,否则将导致引擎放弃索引使用全盘扫描 如:
select id from t where num=10 or num=20
select id from t where num=10union allselect id from t where num=20
3.in 和not in 也要慎用,否则导致全盘扫描
select id from t where num in(1,2,3)
对于连续的查询使用betw
select id from t where num between 1 and 3
4.任何地方不要使用select *from t 用具体的字段列表代替“*”,不要返回不用的任何字段
5.应尽量避免在where子句中对字段进行表达式操作,这将导致引擎放弃索引使用全盘扫描,如:
select id from t where num/2=100
改为
select id from t where num=100*2
6.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id
改为:
select id from t where name like ‘abc%’
select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′
7.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些
8、很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
改为
select num from a where exists(select 1 from b where num=a.num)
三、请列举常见的http头及其作用
四、请列举常见http状态码及其意义
200请求被成功接收
301,重定向:永久跳转,完成请求还需进一步操作
302.重定向:临时跳转,完成请求还需进一步操作
304,没有修改过:请求的内容没有修改过
403:,客户端错误:没有权限,拒绝访问
404,客户端错误:所访问页面不存在,错误页面
500,服务器内部错误,服务器未能实现合法的请求
五、请简述sql注入的攻击原理及如何在代码层面sql注入
六、请简述msyql如何进行多表查询