数据库其他常见面试题

1、MYSQL什么时候会出现死锁?

一般情况只发生锁超时,就是一个进程需要访问数据库表或者字段的时候,另外一个程序正在执行带锁的访问(比如修改数据),那么这个进程就会等待,当等了很久锁还没有解除的话就会锁超时,报告一个系统错误,拒绝执行相应的SQL操作。
发生死锁的情况比较少,比如一个进程需要访问两个资源(数据库表或者字段),当获取一个资源的时候进程就对它执行锁定,然后等待下一个资源空闲,这时候如果另外一个进程也需要两个资源,而已经获得并锁定了第二个资源,那么就会死锁,因为当前进程锁定第一个资源等待第二个资源,而另外一个进程锁定了第二个资源等待第一个资源,两个进程都永远得不到满足。

解决方案可以是:一次性分配所有的表资源,这样就不会死锁。

2、B+树索引和hash索引的区别

Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash 索引的查询效率要远高于 B-Tree索引。
1. 哈希索引能以 O(1) 时间进行查找,但是失去了有序性:无法用于排序与分组;只支持精确查找,无法用于部分查找和范围查找。Hash索引仅仅能满足"=",“IN"和”<=>"查询,不能范围查询,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询)
因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
2. Hash索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

使用选择

如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引

InnoDB 存储引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找。

 

3、什么时候Mysql会有慢查询?你写的sql有过慢查询吗?

比如:select *;

4、怎么样避免写出慢SQL

使用explain关键字执行执行计划来测试sql性能

5、一条SQL语句执行得很慢的原因有哪些?

  • 没有建索引
  • 没有命中索引
  • 索引失效
  • 表设计不合理
  • 索引设计不合理
  • SQL中有很多子表查询或者连接了多张表

解决方案:

posted @ 2020-12-18 14:16  Lucky小黄人^_^  阅读(185)  评论(0编辑  收藏  举报