MySQL — SQL 优化与架构
📋 本文节选自《MySQL 面试题》,返回 查看全部章节
28、什么情况下设置了索引但无法使用
1、 以“%”开头的LIKE语句,模糊匹配;
2、 OR语句前后没有同时使用索引;
3、 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型);
29、实践中如何优化 MySQL
最好是按照以下顺序优化:
1、 SQL语句及索引的优化;
2、 数据库表结构的优化;
3、 系统配置的优化;
4、 硬件的优化;
30、优化数据库的方法
1、 选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如’省份’、’性;别’最好适用 ENUM
2、 使用连接(JOIN)来代替子查询;
3、 适用联合(UNION)来代替手动创建的临时表;
4、 事务处理;
5、 锁定表、优化事务处理;
6、 适用外键,优化锁定表;
7、 建立索引;
8、 优化查询语句;
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 类型
36、对于关系型数据库而言,索引是相当重要的概念,请回答
有关索引的几个问题:
1、 索引的目的是什么?;快速访问数据表中的特定信息, 提高检索速度创建唯一性索引, 保证数据库表中每一行数据的唯一性。加速表和表之间的连接
2、 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
3、 索引对数据库系统;的负面影响是什么?负面效果:创建索引和维护索引需要耗费时间, 这个时间随着数据量的增加而增加; 索引需要占用物理空间, 不光是表需要占用数据空间, 每个索引也需要占用物理空间; 当对表进行增、删、改、的时候索引也要动态维护, 这样就降低了数据的维护速度。
4、 为数据表建立索引的原则有哪些?;在最频繁使用的、用以缩小查询范围的字段上建立索引。 在频繁使用的、需要排序的字段上建立索引
5、 什么情况下不宜建立索引?;对于查询中很少涉及的列或者重复值比较多的列, 不宜建立索引。对于一些特殊的数据类型, 不宜建立索引, 比如文本字段( text) 等
37、解释 MySQL 外连接、内连接与自连接的区别
先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中, 即内连接只连接匹配的行。外连接其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行, 这三种情况依次称之为左外连接, 右外连接, 和全外连接。左外连接, 也称左连接,左表为主表, 左表中的所有记录都会出现在结果集中, 对于那些在右表中并没有匹配的记录, 仍然要显示, 右边对应的那些字段值以NULL 来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换, MySQL 目前还不支持全外连接。
38、Myql 中的事务回滚机制概述
事务是用户定义的一个数据库操作序列, 这些操作要么全做要么全不做, 是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。要同时修改数据库中两个不同表时,如果它们不是一个事务的话, 当第一个表修改完, 可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态, 而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候, 当第一个表修改完, 第二表修改出现异常而没能修改, 第一个表和第二个表都要回到未修改的状态, 这就是所谓的事务回滚
39、SQL 语言包括哪几部分?每部分都有哪些操作关键字?
SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询( DQL) 四个部分。数据定义: Create Table,Alter Table,Drop Table, Craete/Drop Index 等数据操纵: Select,insert,update,delete,数据控制: grant,revoke 数据查询: select
40、完整性约束包括哪些?
数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。分为以下四类:
1、 实体完整性:规定表的每一行在表中是惟一的实体;
2、 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等;规定。
3、 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,;防止了数据丢失或无意义的数据在数据库中扩散。
4、 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束;条件。用户定义的完整性即是针对某个特定关系数据库的约束条件, 它反映某一具体应用必须满足的语义要求。与表有关的约束:包括列约束(NOT NULL( 非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE) 。
为了帮助更多的粉丝朋友,找到个好工作,多拿几个offer。苏三最近建一些工作内推群,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。
