【笔记】MySql数据库

292 阅读3分钟

为什么要使用索引

什么样的信息能成为索引

索引的数据结构

密集索引和稀疏索引的区别


如何定位并优化慢查询sql

  • 1.根据慢日志定位慢查询sql
  • 2.使用explain等工具分析sql
  • 3.修改sql或者让sql走索引

联合索引的最左匹配原则的成因

最左匹配原则:

  • 1.myql会一直向右匹配直到遇到范围查询(>,<,between,like)就停止匹配,比如a=3 and b=4 and c>5 and d=6 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,,b,d,c)的索引,则都可以用到,a,b,d的顺序可以任意调整
  • 2.=和in可以乱序,比如a=1 and b=2 and c=3 ,建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

成因: mysql创建复合索引的规则是首先会对复合索引的最左边,也就是索引中的第一个字段进行排序,在第一个字段排序的基础上,在对索引上第二个字段进行排序,其实就像是实现类似order by 字段1,字段2这样的排序规则,那么第一个字段是绝对有序的,而第二个字段就是无序的了,因此一般情况下直接只用第二个字段判断是用不到索引的,这就是为什么mysql要强调联合索引最左匹配原则的原因。

索引是建立的越多越好吗

  • 1.数据量小的表不需要建立索引,建立索引会增加额外的索引开销
  • 2.数据变更需要维护索引,因此更多的索引意味着更多的维护成本
  • 3.更多的索引也意味着需要更多的空间

MyISAM和InnoDB关于锁方面的区别是什么

MyISAM适合的场景

  • 1.频繁执行全表count语句
  • 2.对数据进行增删改的频率不高,查询非常频繁
  • 3.没有事务

InnoDB适合的场景

  • 1.数据增删改查都非常频繁
  • 2.可靠性要求比较高,要求支持事务

数据库锁的分类

  • 按锁的粒度划分
    • 表级锁
    • 行级锁
    • 页级锁
  • 按锁级别话费
    • 共享锁
    • 排它锁
  • 按加锁方式划分
    • 自动锁
    • 显式锁
  • 按操作划分
    • DML锁
    • DDL锁
  • 按使用方式划分
    • 乐观锁
    • 悲观锁

数据库事务的四大特性

ACID

  • 1.原子性(Atomic)
  • 2.一致性(Consistency)
  • 3.隔离性(Isolation)
  • 4.持久性(Durability)

事务隔离级别以及各级别下的并发访问问题

  • 脏读,事务隔离级别修改为read committed,即不允许读取其它未提交事务的数据
  • 不可重复读,多次读数据不一致,设置事务隔离级别为repeatable read及以上
  • 幻读,serializable事务隔离级别可避免

事务隔离级别从低到高

事务隔离级别更新丢失脏读不可重复读幻读
未提交读(Read uncommitted)避免发生发生发生
已提交读(Read committed)避免避免发生发生
可提交读(Read read)避免避免避免发生
串行化(Serializable)避免避免避免避免

当前读和快照读

  • 当前读:
    • select...lock in share mode,
    • select...for update,
    • update, delete, insert
  • 快照读:不加锁的非阻塞读,select

InnoDB可重复读(RR)隔离级别下如何避免幻读

  • 1.表象,快照读
  • 2.内在,next-key锁(行锁+Gap锁)

可重复读(RR)下,对主键索引或者唯一索引会用Gap锁吗

Gap锁主要出现在非唯一索引或者不走索引的当前读中

  • 1.如果where条件全部命中,则不会用Gap锁,只会加记录锁
  • 2.如果where条件部分命中或全不命中,则会加Gap锁

RC、RR级别下的InnoDB的非阻塞读如何实现

  • 1.数据行里的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID字段
  • 2.undo日志
  • 3.read view