为什么要使用索引
什么样的信息能成为索引
索引的数据结构
密集索引和稀疏索引的区别
如何定位并优化慢查询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