MySQL面试常问问题
1.mysql事务特征
答:原子性,一致性,隔离性,持久性。
2.mysql索引是怎么实现的
答:数据库索引通常使用B树或者B+树
3.mysql的搜索引擎MyISAM 和 InnoDB 是MySQL区别?
答:
m:MyISAM i:InnoDB
- 事务支持
m: 不支持事务, 追求的性能, 速度
i: 支持事务 功能强大- 全文索引 FULLTEXT
m: 支持
i: 不支持 通过第三方技术shpinx 来完成全文索引
注意: MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;
只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。- CURD操作
m: 执行大量的查询操作, 速度相对比较快
i: 执行大量的增删改操作, 速度相对比较快- 表总行数
m: 存储总行数 , 通过count() 来统计总行数, 直接获取
i: 没存总行数 , 通过count() 来统计总行数, 消耗巨大
注意: 如果带条件的查询, 两者没区别, 消耗都巨大- 行锁,表锁
m: 支持表锁
i: 支持表锁, 也支持行锁(默认)总结:
对于多读少写, 重速度, 建议采用 MyISAM
对于多写少读, 需要事务, 大数据, 建议采用 InnoDB
4.mysql三范式
答:1NF:无重复的列,每一列都是不可分割的基本数据项,同一 列中不能有多个值,即实体中的某个属性不能有多个值或者不 能有重复的属性。
2NF:属性完全依赖于主键,第二范式必须先满足第一范式, 要求表中的每个行必须可以被唯一地区分。通常为表加上一个 列,以存储各个实例的唯一标识PK,非PK的字段需要与整个 PK有直接相关性
3NF 属性不依赖于其他非主属性;
5.mysql隔离级别
答:mysql事务的并发问题一般有:脏读,不可重复读,幻读三种情况。mysql给出了四种数据隔离级别:读未提交,读已提交,不可重复读,串行化。一般使用第三级别(不可重复读)就可以解决脏读和不可重复读的问题,串行化三种问题都可以解决。
6.mysql优化简单说下?
答:首先去看需要优化的SQL,先分析SQL中有没有用到索引,如果用到了给常用的字段加上索引,如果加了索引还是很慢,就是使用show profile命令分析具体原因,看看加了索引是否用到了。
一般使用SQL查询时需要注意什么:
(1) 尽量不要使用select * ,换成加上索引的字段
(2) 少用in ,如果in里面的数据比较多还是会回表的
(3) 对查询的列不要使用函数或者运算。否则索引无法使用。
一般加了索引但没有用到的情况:
(1) 用OR分隔开的条件,如果OR前面的条件中的列有索引,而后面的列没有索引,那么涉及到的列索引不会被使用。
(2) 不是用到复合索引中的第一列即最左边的列的话,索引就不起作用(最左原则)。
(3) 如果like是以%开头的
(4) 如果列类型是字符串,那么where条件中字符常量值不用’’引号引起来的话,那就不会失去索引效果,这是因为MySQL会把输入的常量值进行转换再使用索引。
(5)order by 字段混合使用DESC ASC 不会使用索引;Where条件过滤的关键字和Order by中所使用的不同 不会使用索引.
1、查看SQL的执行频率---------------使用show status命令
2、定位哪些需要优化的SQL------------通过慢查询记录+show processlist命令查看当前线程
3、分析为什么SQL执行效率低------------使用explain/desc命令分析
相关列简单解释:type、table、select_type...
4、对症下药采取优化措施-----------举例采取index进行优化
7.主键和唯一索引的区别?
答:
主键和唯一索引都要求值唯一,但是它们还是有区别的:
①.主键是一种约束,唯一索引是一种索引;
②.一张表只能有一个主键,但可以创建多个唯一索引;
③.主键创建后一定包含一个唯一索引,唯一索引并一定是主键;
④.主键不能为null,唯一索引可以为null;
⑤.主键可以做为外键,唯一索引不行;
⑥.主键约束比唯一索引约束严格,当没有设定主键时,非空唯一索引自动称为主键。主键产生唯一的聚集索引,唯一索引产生唯一的非聚集索引
注:聚集索引确定表中数据的物理顺序,所以是主键是唯一的(聚集就是整理数据的意思)
从图中不难看出,主键索引和非主键索引的区别是:非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也被称为聚簇索引。
根据这两种结构我们来进行下查询,看看他们在查询上有什么区别。
1、如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。
2、如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。
8.为什么添加了索引,查询会更快?
答:
传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,mysql需要将表的数据从头到尾遍历一遍
在我们添加完索引之后,mysql一般通过BTREE算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历(折半查找大幅查询效率),找到相应的键从而获取数据索引的代价:
创建索引是会产生索引文件的,占用磁盘空间;索引文件是一个二叉树类型的文件,可想而知我们的dml操作同样也会对索引文件进行修改,所以性能会下降
9.在哪些column上使用索引?
答:
1.较频繁的作为查询条件字段应该创建索引
2.唯一性太差的字段不适合创建索引,尽管频繁作为查询条件,例如gender性别字段
3.更新非常频繁的字段不适合作为索引
4.不会出现在where子句中的字段不该创建索引