mysql 面试官喜欢问的问题

一、主键索引 和唯一索引 有什么区别
  1. 主键是一种约束,唯一索引是一种索引,
  2. 主键创建后,一定包括一个唯一索引,唯一索引并不是就是主键
  3. 主键索引不允许为空值,但是唯一索引包括
  4. 主键只能创建一个索引,但是唯一索引可以创建多个
二、索引失效的原因
  1. 使用or 条件,这时候,规定所有条件都必须有索引
  2. 使用联合索引,要遵循最左原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到
  3. 索引不能使用运算 或者 函数
  4. 尽量避免使用 != 或 not in或 <> 等否定操作符
  5. 索引列不会包含NULL值
  6. 隐式转换的影响
    select* from news where date_str =201701 //date_str 为一个字符串的时候
  7. like 语句的索引失效问题
    like 的方式进行查询,在 like "value%" 可以使用索引,但是对于 like "%value%" 这样的方式,执行全表查询
三、SQL 约束有哪几种?
  1. 非空约束,NOT NULL: 用于控制字段的内容一定不能为空(NULL)。
  2. 唯一约束,UNIQUE: 控件字段内容不能重复,一个表允许有多个 Unique 约束。
  3. 主键约束,PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只允许出现一个。
  4. 外键约束,FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。
  5. 默认值约束:DEFAULT:可以使用DEFAULT修饰符为字段设定一个默认值。当插入记录时,如果忘记插入该字段的值,MySQL会自动为您设置上该字段的默认值。
  6. 自增约束:AUTO_INCREMENT: 修饰符只适用于INT字段,表明MySQL应该自动为该字段生成一个数(每次在上一次生成的数值上面加1)。对于主键(稍候介绍),这是非常有用的。因为其允许开发者使用MySQL为每条记录创建唯一的标识符。

mysql不支持CHECK约束,要想达到check约束的效果,应将限制列设置为enum 枚举型。
非主外键字段可以同时设置NOT NULL,CHECK约束,或者NOT NULL,DEFAULT,CHECK,只要不冲突就可以。

四、使用视图的优点是啥
  1. 简化查询,提高效率
  2. 由于直接操作的是临时表,所以对原表数据没影响,提高了安全性
五、视图有哪些特点?
  1. 视图的列可以来子不同表
  2. 视图是抽象出来的表,本身不存在实体表
  3. 视图的删除和建立 都不影响基本表
  4. 对视图内容的更新(添加,删除和修改)直接影响基本表。
  5. 当视图来自多个基本表时,不允许添加和删除数据。
六、事务的四大特性
  1. 原子性:事务只允许完成,或者 不完成,没有其他
  2. 一致性:执行事务前后,数据保持一致(数据准备性)
  3. 离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  4. 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
七、创建索引的原则

索引虽好,但也不是无限制的使用,最好符合一下几个原则

  1. 最左前缀匹配原则,组合索引非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
  2. 较频繁作为查询条件的字段才去创建索引
  3. 更新频繁字段不适合创建索引
  4. 若是不能有效区分数据的列不适合做索引列(如性别,男女未知,最多也就三种,区分度实在太低)
  5. 尽量的扩展索引,不要新建索引。比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可。
  6. 定义有外键的数据列一定要建立索引。
  7. 对于那些查询中很少涉及的列,重复值比较多的列不要建立索引。
  8. 对于定义为text、image和bit的数据类型的列不要建立索引。
八、索引的使用场景
  1. where 查询的字段
  2. order by 当我们使用order by将查询结果按照某个字段排序时,如果该字段没有建立索引,那么执行计划会将查询出的所有数据使用外部排序(将数据从硬盘分批读取到内存使用内部排序,最后合并排序结果),这个操作是很影响性能的,因为需要将查询涉及到的所有数据从磁盘中读到内存(如果单条数据过大或者数据量过多都会降低效率),更无论读到内存之后的排序了。

但是如果我们对该字段建立索引alter table 表名 add index(字段名),那么由于索引本身是有序的,因此直接按照索引的顺序和映射关系逐条取出数据即可。而且如果分页的,那么只用取出索引表某个范围内的索引对应的数据,而不用像上述那取出所有数据进行排序再返回某个范围内的数据。(从磁盘取数据是最影响性能的)

  1. join
    对join语句匹配关系(on)涉及的字段建立索引能够提高效率(外键一定要建 索引)
    4.索引覆盖
    如果要查询的字段都建立过索引,那么引擎会直接在索引表中查询而不会访问原始数据(否则只要有一个字段没有建立索引就会做全表扫描),这叫索引覆盖。因此我们需要尽可能的在select后只写必要的查询字段,以增加索引覆盖的几率。
    这里值得注意的是不要想着为每个字段建立索引,因为优先使用索引的优势就在于其体积小。
九、按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法

在关系型数据库中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎)、表级锁(MYISAM引擎)和页级锁(BDB引擎 )。

MyISAM和InnoDB存储引擎使用的锁:

MyISAM采用表级锁(table-level locking)。
InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
行级锁,表级锁和页级锁对比

行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁 和 排他锁。

特点:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

表级锁 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

特点:开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

页级锁 页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。

特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

十、MySQL 可以从哪些方面来优化
  1. 索引优化
  2. Sql语句 优化
  3. 数据库表的优化,一般情况下使用标准的三大范式,特殊情况下可以使用反三大方式。例如省市区,可以独立成三个字段
  4. 主从配置,读写分离
  5. 分表分库
  6. 使用缓存(例如redis) 减少数据库的I/O

你可能感兴趣的:(mysql 面试官喜欢问的问题)