mysql的最左前缀原则是什么
答:
- 在使用联合索引时,查询条件中必须包含联合索引的最左列的索引才可能用到索引
- 底层原理是,联合索引在b+树的排序顺序是依次从左到右 比较,如果最左列都没有,索引直接失效
- 情况:
- 完全匹配:即包含联合索引的全部字段
- 此时索引完全生效,效率最高
- 部分匹配:包含最左列及后续连续的部分列
- 此时只有部分会用到索引,没有的字段索引会失效
- 如果对字段使用如>或<,一般使用>=或<=等这种包含等值的,可能索引会有效
- 在mysql8.0+支持索引跳跃扫描:最左列区分度低时,如索引
(a, b)
,查询b=2
时,会拆分为a=1 AND b=2
、a=2 AND b=2
就会把最左列的所有情况都包括,最后合并查询结果
- 条件字段的顺序:虽然mysql会自动调整
- 失效情况:
- 不包含最左列:索引完全失效
- 中间列缺失或范围查询:从缺失开始失效或范围查询的字段开始后面的索引失效
- 非前缀模糊查询:如like '%name'这样的明显无法使用索引
- 完全匹配:即包含联合索引的全部字段
msql的索引类类型有哪些
答:
- 从数据结构看:
- B+树索引
- 哈希索引
- 倒排索引:这个就是本来是从文章去判断是否包含关键字的,这个就是从关键词直接获得包含该关键字的文章
- 空间索引:这个存储地理空间数据的
- 从存储方式:
- 聚族索引:叶子节点包含行数据
- 非聚族索引:节点一般包含主键和索引列,可能需要回表查询
- 从字段特性:
- 主键索引:唯一且不允许空值,每个表仅能有一个主键索引,默认为聚族索引
- 唯一索引:确保列值唯一,可以为空
- 普通索引:没有限制
- 前缀索引:仅对字段的前N个字段创建索引
- 从字段数量:
- 单列索引:基于单个字段创建
- 联合索引:基于多个字段创建
msql的索引类类型有哪些
问题:
- 脏读:读取到其他事务未提交的数据,可能产生数据不一致性
- 不可重复读:同个事务多次读取同一数据的结果不同,这个可能存在其他事务进行了修改
- 幻读:同一事务,开始没有查到记录,但当插入时数据却有了,可能是其他事务进行了添加
读未提交
- 定义:可以读取到其未提交事务的修改数据
- 问题:
- 脏读
- 不可重复读
- 幻读
读已提交
- 定义:事务只能读取其他已提交事务的修改
- 问题:
- 不可重复读
- 幻读
- 实现方式:
- 使用行级锁:锁住单个数据,就不会出现读取到事务未提交的数据
可重复读:(mysql的默认事务级别)
- 定义:多次读取同一数据的结果一致
- 问题
- 幻读
可序列化(或称串行(xing)化)
- 定义:事务串行执行,完全隔离
- :问题
- 没有问题,就是效率低
mysql的默认事务级别是什么,为什么选择这个级别
答:
- 默认为可重复读
- 因为在mysql中使用了mvcc(多版本(mv)-并发控制(cc)):让同一个事务读取同一数据时能看到一致的快照版本还有间隙锁、行键锁锁定了索引范围,有效抑制了幻读,提高了并发能力
- 通过MVCC和gap lock和next-key lock的协同,找到了通用场景下的最优解
mysql中的count(*)、count(1)、count(字段)有什么区别
答
- 功能区别:
- count(*):统计所有的列,包括null
- count(1):和count(*)一样,它不依赖其他值,每一行结果都是1,所以都会被计数
- count(字段):这主要用于统计某一列的非null值的数量
- 性能区别:
- count(*)≈count(1)>= count(字段)