面试总结——MySQL

导读:本篇文章讲解 面试总结——MySQL,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1. InnoDB与MyISAM的区别?

  1. MyISAM不支持事务,InnoDB支持事务
  2. MyISAM只支持表级锁,InnoDB支持行级锁和表级锁,默认使用行级锁
  3. MyISAM 允许没有任何索引主键的表存在,不支持外键
  4. InnoDB的主键不能为空且支持主键自增长,如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键,支持外键完整性约束
  5. MyISAM 和 InnoDB 都是使用B+树索引

2. 什么是事务?

数据库的事务是并发控制的基本单位,是指逻辑上的一组操作要么全部执行,要么全部不执行

3. 事务的特性

(1)原子性:事务是一个不可分割的工作单元,事务里的操作要么都成功,要么都失败,如果事务执行失败,则需要进行回滚。
(2)隔离性:事务的所操作的数据在提交之前,对其他事务的可见程度。
(3)持久性:一旦事务提交,它对数据库中数据的改变就是永久的。
(4)一致性:事务不能破坏数据的完整性和业务的一致性。例如在转账时,不管事务成功还是失败,双方钱的总额不变。

4. 数据库中的锁机制?

  1. 事务在修改数据库之前,需要先获得相应的锁,获得锁的事务才可以修改数据;
  2. 在该事务操作期间,这部分的数据是锁定其他事务如果需要修改数据,需要等待当前事务提交或回滚后释放锁。

5. 表级锁、行级锁、页级锁

  1. 表级锁最大粒度的锁级别,发生锁冲突的概率最高并发度最低,但开销小加锁快不会出现死锁
  2. 行级锁最小粒度的所级别,发生锁冲突的概率最小,并发度最高,但开销大,加锁会发生死锁
  3. 页级锁:锁粒度界于表级锁和行级锁之间,对表级锁和行级锁的折中,并发度一般。开销和加锁时间也界于表锁和行锁之间,会出现死锁

6. InnoDB的行锁有两种类型:

  1. 共享锁(S锁、读锁):多个事务可以对同一数据行共享一把S锁,但只能读,不能改
  2. 排它锁(X锁、写锁):一个事务获取排它锁之后,可以对锁定范围内的数据行执行写操作,在锁定期间,其他事务不能再获取这部分数据行的锁(共享锁、排它锁),只允许获取到排它锁的事务进行更新数据。

7. MySQL索引的实现原理:

  1. 索引本质上就是一种通过减少查询需要遍历行数加快查询性能的数据结构

8. 索引优点

  1. 减少查询行数,加快查询速度,避免进行全表扫描,这也是创建索引的最主要的原因。
  2. 如果索引的数据结构是B+树,在使用分组和排序时,可以显著减少查询中分组和排序的时间
  3. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

9. 索引缺点

  1. 当对表中的数据进行增加、删除和修改时,索引也要进行更新,维护的耗时随着数据量的增加而增加
  2. 索引需要占用物理空间

10. 在哪些列上面创建索引:

  1. WHERE子句中经常出现的列上面创建索引
  2. 按范围存取的列或者在group byorder by中使用的列
  3. 经常用于连接的列上,这些列主要是一些外键
  4. 作为主键的列上,强制该列的唯一性和组织表中数据的排列结构

11. 不在哪些列建索引?

  1. 区分度不高的列:由于这些列的取值很少,例如性别
  2. 在查询中很少用到的列
  3. 添加索引造成修改成本的提高 远远大于 检索性能的提高
  4. 定义为text, image和bit数据类型的列:这些列的数据量要么相当大

12. 索引的分类:

  1. 普通索引:最基本的索引,没有任何限制
  2. 唯一索引:但索引列的值必须唯一允许有空值,可以有多个NULL值。如果是组合索引,则列值的组合必须唯一。
  3. 主键索引:一种特殊的唯一索引,不允许有空值
  4. 全文索引:全文索引仅可用于 MyISAM 表,并只支持从CHAR、VARCHAR或TEXT类型,用于替代效率较低的like 模糊匹配操作,而且可以通过多字段组合的全文索引一次性全模糊匹配多个字段。
  5. 组合索引:主要是为了提高mysql效率,创建组合索引时应该将最常用作限制条件的列放在最左边,依次递减。

13. 索引的数据结构

  1. Hash索引:MySQL中只有Memory存储引擎支持hash索引,是Memory表的默认索引类型。hash索引把数据以hash值形式组织起来,因此查询效率非常高,可以一次定位。
  2. B+Tree索引:mysql使用最频繁的一个索引数据结构
  3. B+Tree索引在查找时需要从根节点到叶节点进行多次IO操作,在查询速度比不上Hash索引,但是更适合排序等操作。

14. 为什么使用B+Tree作为索引

  1. 索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上,索引的数据结构要尽量减少查找过程中磁盘I/O的存取次数
  2. B+树有利于对数据库的扫描B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题,而B+树只需要遍历叶子节点就可以解决对全部关键字信息的扫描,所以范围查询、排序等操作,B+树有着更高的性能
  3. B+树的磁盘IO代价更低B+树的内部结点的data域并没有存储数据,因此其内部结点相对于B树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多一次性读入内存中的需要查找的关键字也就越多,相对来说I/O读写次数也就降低了。
  4. B+树的查询效率更加稳定:由于B+树的内部结点只是叶子结点中关键字的索引,并不存储数据。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

15. 添加索引

ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)

  1. //普通索引
    alter table table_name add index index_name (column_list) ;
  2. //唯一索引
    alter table table_name add unique (column_list) ;
  3. //主键索引
    alter table table_name add primary key (column_list) ;

16. MySQL优化

  1. 选取最适用的字段属性

    1. 例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),增加了不必要的空间,因为CHAR(6)就可以很好的完成任务了
    2. 尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值
    3. 数值型处理起来速度要比文本类型快得多
  2. 使用连接(JOIN)来代替子查询(Sub-Queries)

  3. 使用联合(UNION)来代替手动创建的临时表

  4. 事务

  5. 锁定表
    假设有成千上万的用户同时访问一个数据库系统,例如访问一个电子商务网站,就会产生比较严重的响应延迟。其实,有些情况下我们可以通过锁定表的方法来获得更好的性能

  6. 使用外键

  7. 使用索引
    where、范围、连接、主键

  8. 优化的查询语句

    1. 最好是在相同类型的字段间进行比较的操作
    2. 在建有索引的字段上尽量不要使用函数进行操作
    3. 在搜索字符型字段时,使用LIKE关键字和通配符,会牺牲系统性能

17. MySQL插入数据

INSERT INTO table_name 
( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );

18. MySQL 查询数据

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

19. MySQL UPDATE 更新

UPDATE table_name 
SET 
field1=new-value1, field2=new-value2
[WHERE Clause]

20. 排序

SELECT field1, field2,...fieldN 
FROM table_name1, table_name2...
ORDER BY field1 [ASC [DESC][默认 ASC]], [field2...] [ASC [DESC][默认 ASC]]

21. GROUP BY 语句

SELECT column_name, 
function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/65607.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!