31、简单描述 MySQL 中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)
索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用指针。 普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的访问速 度。 普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼 此各不相同的值,在为这个数据列创建索引的时候就应该用关键字 UNIQUE 把它 定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。 主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯 一标识一条记录,使用关键字 PRIMARY KEY 来创建。 索引可以覆盖多个数据列,如像 INDEX(columnA, columnB)索引,这就是联合索 引。 索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度, 因为在执行这些写操作时,还要操作索引文件。
32、数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有 操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作 失败,则事务将回滚,该事务所有操作的影响都将取消。 事务特性: 1、原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。 2、一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状 态 3、隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何 其他事务, 4、持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后 有了其他故障,事务的处理结果也会得到保存。 或者这样理解: 事务就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组,如果任何一个语 句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上 有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作 为事务考虑,就需要通过 ACID 测试,即原子性,一致性,隔离性和持久性。
33、SQL 注入漏洞产生的原因?
如何防止? SQL 注入产生的原因:程序开发过程中不注意规范书写 sql 语句和对特殊字符进 行过滤,导致客户端可以通过全局变量 POST 和 GET 提交一些 sql 语句正常执行。 防止 SQL 注入的方式: 开启配置文件中的 magic_quotes_gpc 和 magic_quotes_runtime 设置执行 sql 语句时使用 addslashes 进行 sql 语句转换 Sql 语句书写尽量不要省略双引号和单引号。 过滤掉 sql 语句中的一些关键词:update、insert、delete、select、 * 。 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不 易被猜到的。
34、为表中得字段选择合适得数据类型 ?
字段类型优先级: 整形>date,time>enum,char>varchar>blob,text 优先考虑数字类型,其次是日期或者二进制类型,最后是字符串类型,同级别得 数据类型,应该优先选择占用空间小的数据类型
35、存储时期
Datatime:以 YYYY-MM-DD HH:MM:SS 格式存储时期时间,精确到秒, 占用 8 个字节得存储空间,datatime 类型与时区无关 Timestamp:以时间戳格式存储,占用 4 个字节,范围小 1970-1-1 到 2038-1-19, 显示依赖于所指定得时区,默认在第一个列行的数据修改时可以自动得修改 timestamp 列得值 Date:(生日)占用得字节数比使用字符串.datatime.int 储存要少,使用 date 只 需要 3 个字节,存储日期月份,还可以利用日期时间函数进行日期间得计算 Time:存储时间部分得数据 注意:不要使用字符串类型来存储日期时间数据(通常比字符串占用得储存空间小, 在进行查找过滤可以利用日期得函数) 使用 int 存储日期时间不如使用 timestamp 类型