MySQL面试题

1、主键索引与唯一索引的区别

1、 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
2、 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
3、唯一性索引列允许空值,而主键列不允许为空值。
4、 主键列在创建时,已经默认为空值 ++ 唯一索引了。
5、一个表最多只能创建一个主键,但可以创建多个唯一索引。
6、主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
7、 主键可以被其他表引用为外键,而唯一索引不能。

2、SQL的生命周期?

1、应用服务器与数据库服务器建立一个连接
2、 数据库进程拿到请求sql
3、 解析并生成执行计划,执行
4、 读取数据到内存并进行逻辑处理
5、 通过步骤一的连接,发送结果到客户端
6、 关掉连接,释放资源

3、数据库三大范式是什么

第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。

4、怎么优化SQL查询语句吗

1、 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
2、 用索引可以提高查询
3、 SELECT子句中避免使用*号,尽量全部大写SQL
4、 应尽量避免在 where 子句中对字段进行 is null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,使用 IS NOT NULL
5、 where 子句中使用 or 来连接条件,也会导致引擎放弃使用索引而进行全表扫描
6、 in 和 not in 也要慎用,否则会导致全表扫描

5、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:

1.索引的目的是什么?

快速访问数据表中的特定信息,提高检索速度
创建唯一性索引,保证数据库表中每一行数据的唯一性。
加速表和表之间的连接
使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

2.索引对数据库系统的负面影响是什么?

负面影响:
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。

3.为数据表建立索引的原则有哪些?

在最频繁使用的、用以缩小查询范围的字段上建立索引。
在频繁使用的、需要排序的字段上建立索引

4.什么情况下不宜建立索引?

对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。
对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等

6、什么情况下设置了索引但无法使用

1、以“%”开头的LIKE语句,模糊匹配
2、OR语句前后没有同时使用索引
3、数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)

7、主键使用自增ID还是UUID,为什么?

如果是单机的话,选择自增ID;如果是分布式系统,优先考虑UUID吧,但还是最好自己公司有一套分布式唯一ID生产方案吧。
1、 自增ID:数据存储空间小,查询效率高。但是如果数据量过大,会超出自增长的值范围,多库合并,也有可能有问题。
2、 uuid:适合大量数据的插入和更新操作,但是它无序的,插入数据效率慢,占用空间大

8、SQL语句的语法顺序:

1、 SELECT
2、 FROM
3、 JOIN
4、ON
5、 WHERE
6、 GROUP BY
7、 HAVING
8、 UNION
9、 ORDER BY
10、 LIMIT

9、字段为什么要求定义为not null?

null值会占用更多的字节,并且null有很多坑的。

10、varchar(50)中50的涵义

最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)。在早期 MySQL 版本中, 50 代表字节数,现在代表字符数。

11、索引失效情况?

1、 like以%开头索引无效,当like以&结尾,索引有效。
2、 or语句前后没有同时使用索引,当且仅当or语句查询条件的前后列均为索引时,索引生效。
3、 组合索引,使用的不是第一列索引时候,索引失效,即最左匹配规则。
4、 数据类型出现隐式转换,如varchar不加单引号的时候可能会自动转换为int类型,这个时候索引失效。
5、 在索引列上使用IS NULL或者 IS NOT NULL 时候,索引失效,因为索引是不索引空值得。
6、 在索引字段上使用,NOT、 <>、!= 、时候是不会使用索引的,对于这样的处理只会进行全表扫描。
7、 对索引字段进行计算操作,函数操作时不会使用索引。
8、 当全表扫描速度比索引速度快的时候不会使用索引。

12、MySQL中有哪几种锁?

1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值