SQL面试
1.数据库索引原理,如何发挥作用?针对插入操作,会对索引会起什么影响?
索引的思想就是,根据表中数据建立一套索引数据结构-平衡树( b+ tree),每次查询的时候,在内存中根据该结构得到所需要的数据的物理地址,根据物理地址直接去磁盘中拿到结果数据,不用将表中的所有数据都加载到内存扫描一遍。
索引能让数据库查询数据的速度上升, 而使写入数据的速度下降。 因为要维持平衡树这个结构, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,会占用不小的性能,也就是为什么索引会给查询以外的操作带来副作用的原因。
https://www.cnblogs.com/aspwebchh/p/6652855.html
2.什么是聚集索引,什么是非聚集索引?什么是主键?
索引指向需要的数据,那么这个索引就是聚集索引,一般Mysql主键就是聚集索引,修改聚集索引其实就是修改主键。
索引的存储和数据的存储是分离的,也就是说找到了索引但没找到数据,需要根据索引上的值(主键)再次回表查询,非聚集索引也叫做辅助索引。
主键是唯一非空的聚集索引。
聚集索引的顺序,就是数据在硬盘上的物理顺序。一般情况下主键就是默认的聚集索引。一张表只允许存在一个聚集索引,因为真实数据的物理顺序只能有一种。如果一张表上还没有聚集索引,为它新创建聚集索引时,就需要对已有数据重新进行排序,所以对表进行修改速度较慢是聚集索引的缺点,对于经常更新的列不宜建立聚集索引。
聚集索引性能最好,因为一旦具有第一个索引值的记录被找到,具有连续索引值的记录也一定物理地紧跟其后。一张表只能有一个聚集索引,所以非常珍贵,必须慎重设置,一般要根据这个表最常用的SQL查询方式选择某个(或多个)字段作为聚集索引(或复合聚集索引)。聚集索引默认是主键,如果表中没有定义主键,InnoDB会选择一个唯一的非空索引代替(“唯一的非空索引”是指列不能出现null值的唯一索引,跟主键性质一样)。如果没有这样的索引,InnoDB会隐式地定义一个主键来作为聚簇索引。
3.什么是SQL注入式攻击?,如何防范?
提交查询程序含有的参数指向SQL命令,最终达到欺骗服务器执行恶意的SQL命令。
1 )严格检查输入变量的类型和格式对于整数参数,加判断条件:不能为空、参数类型必须为数字对于字符串参数,可以使用正则表达式进行过滤:如:必须为[0-9] [a-z] [A-Z]范围内的字符串。
2 )过滤和转义特殊字符在 username 这个变量前进行转义,对'、"、等特殊字符进行转义。
3 )利用 mysql 的预编译机制。
https://zhuanlan.zhihu.com/p/159212924
https://www.jianshu.com/p/c82148473235
https://www.jianshu.com/p/cae7f2387d57