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条件的话,则两个存储引擎的效率一样,都需要扫描全表