数据库常见问题

1.数据库索引失效的场景:

  • 应尽量避免在 where 子句中使用 != 或 <> 操作符,否则引擎将放弃使用索引而进行全表扫描;
  • 尽量避免在 where 子句中使用 or 来连接条件
  • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引;
  • like的模糊查询以 % 开头,索引失效;
  • 应尽量避免在 where 子句中对字段进行表达式操作
  • 应尽量避免在 where 子句中对字段进行函数操作
  • 不要在 where 子句中的 “=” 左边进行函数、算术运算或其他表达式运算
  • 不适合键值较少的列(重复数据较多的列)
  • 不符合最左前缀匹配原则(设置了索引A、B、C,然后查找的时候使用索引B、C)

2.使用存储过程的优缺点:

  • 优点:(1)存储过程在第一次使用的时候就进行编译,以后每次使用都不需要重新编译,可以提高数据库的执行速度(2)代码复用性,可以重复使用(3)当对数据库进行复杂操作的时候,可将这些复杂操作用存储过程封装起来,避免进行一条条的sql语句操作,只需要连接一次数据库则可以了
  • 缺点:(1)不便于调试(2)没办法使用缓存

3.为什么MySQL数据库索引选择使用B+树?(参考文章:https://blog.youkuaiyun.com/xlgen157387/article/details/79450295)

  • 二叉树的查找速度较快,取决于树的高度,但由于数据库索引存放在磁盘上,当数据量比较大的时候,当我们利用索引查询的时候,不能把索引全部加载到内存中,能做的就是逐一加载每一个磁盘页,这里的磁盘页对应着索引树的节点,所以应当减少磁盘IO次数。所以B-树(平衡的多路查找树)正可以解决这个问题,虽然在节点上元素较多,比较的次数较多,但由于节点上的元素是加载到内存中进行比较的,速度比较快。

4.B+树相对B-树的优势:

  • 磁盘IO次数更少(B+树非叶子节点上存放key值,不存放data,相比B-树,相同节点能够存放更多的data,也就是说,相同节点的话,B+树的高度可能比B-树低------>针对节点数比较多的情况)
  • 查询性能更加稳定(B+树必须从根节点到叶子节点这条路径,才能找到所需的数据;而B-树可能在非叶子节点上就找到所需的数据)
  • 范围查询更加简便(B+树的叶子节点采用一种 顺序指针,只需要遍历一遍,则可以找到所有的数据,并且查找一定范围内的值也很方便)

5.MySQL日志文件分类

  • 错误日志:记录mysql启动、运行或者关闭时出现错误的信息
  • 查询日志:记录所有对数据库的操作,包括增删查改
  • 二进制日志:记录修改数据或者引起mysql数据变化的sql语句
  • 慢查询日志:记录查询时间超过指定阈值的查询语句

6.MySQL存储引擎MyISAM与InnoDB区别

  • 每个MyISAM在磁盘上存储成三个文件。第一个 文件的名字以表的名字开始,扩展名指出文件类型。
    .frm文件存储表定义;.MYD (MYData)存储数据;.MYI (MYIndex)存储索引;
  • 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB
  • 事务:InnoDB支持事务,MyIsam不支持事务
  • 外键:InnoDB支持外键,MyIsam不支持外键
  • 锁:MyIsam只支持表级锁;InnoDB支持表级锁和行级锁,并且支持MVCC(多版本并发控制)来提高并发的性能(多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题),自身也做了一些优化,比如:建立自适应索引,加快查询速度;采用可预测性读磁盘数据;增加了加快插入操作的插入缓冲区
  • 索引:InnoDB的主索引采用的是聚集索引,也就是将数据放在索引上;MyIsam的索引采用的是非聚集索引,只是讲数据的地址放在索引上
  • 查询:如果需要频繁的查询数据的话,MyIsam的效率比InnoDB高;如果需要经常执行插入、删除等操作的话,则优先选择InnoDB
  • 查询行数:select count(*) from table --->MyIsam内部保存了行数,可以直接拿到行数,而InnoDB则需要扫描全表;如果查询语句里面包含where条件的话,则两个存储引擎的效率一样,都需要扫描全表

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值