MySQL⾼频⾯试题
InnoDB引擎的三⼤特点,四⼤特性
三⼤特点:
1. ⽀持事务安全
2. ⽀持⾏锁
3. ⽀持外键
四⼤特性:
插⼊缓冲(insert buffer)
matlab中axis函数⼆次写(double write)
⾃适应哈希索引(ahi)
预读(read ahead)
什么是脏读?幻读?不可重复读?
脏读(Dirty Read):⼀个事务读到另⼀个事务还未提交的数据
不可重复读(Non-repeatable read):⼀个事务先后读取同⼀条记录,但是两次读取的数据不相同
幻读(Phantom Read):⼀个事务按条件查询数据时,并没有对应的数据⾏;但是在插⼊数据时⼜发现这⾏数据已经存在事务的隔离级别
隔离级别脏读不可重复读幻读read uncommitted(读未提交)√√√read committed(读已提交)×√√repeatable read(mysql默认)××√serializable(可串⾏化)×××*事务的四⼤特性ACID
原⼦性:事务是不可分割的最⼩操作单元,要么全部成功,要么全部失败
⼀致性:事务完成时,必须使所有的数据都保持⼀致状态
隔离性:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独⽴环境下运⾏
持久性:事务⼀旦提交或回滚,它对数据库中的数据的改变就是永久的
float类型数据锁有哪些
MySQL中的锁,可以分为三类:
全局锁:锁定数据库中所有的表
表级锁:每次操作锁住整张表
⾏级锁:每次操作锁住对应的⾏数据
全局锁
全局锁就是对整个数据库实例进⾏加锁,加锁后整个实例就处于只读状态.
表锁
搭建数据库表锁每次操作锁住整张锁,很容易发⽣锁冲突,表锁⼜分为表锁,元数据锁,意向锁;
1. 表锁
表共享读锁:都可以读表
表独占写锁:只有⾃⼰可以读写
元数据锁MDL
元数据锁是在加锁过程中系统⾃动控制,在访问⼀张表时会⾃动加上,MDL锁主要作⽤是维护表元数据的数据⼀致性,在表上有活动事务时,不可以对元数据进⾏写⼊操作,避免DML和DDL冲突。
意向锁
为了解决DML在执⾏时加的⾏锁与表锁的冲突,加⼊意向锁使加表锁时不需要检测每⾏数据是否加锁
1. 意向共享锁:与表锁共享锁兼容,与表锁排它锁互斥
2. 意向排它锁:与表锁共享锁和排它锁都互斥
⾏级锁
每次操作锁住对应的⾏数据,锁定⼒度最⼩,发⽣锁冲突概率最低,并发度最⾼
1. 共享锁:允许⼀个事务去读⼀⾏,阻⽌其他事务获得相同数据集的排它锁。
2. 排它锁:允许获取排它锁的事务更新数据,阻⽌其他事务获得相同数据集的共享锁和排它锁
explain 属性
获取MySQL如何执⾏select语句的信息,包含在select语句执⾏中表如何连接和连接的顺序 ,性能分析
explain 各字段的含义
1. ID:查询的序列号,表⽰了查询中执⾏select⼦句或者操作表的顺序;ID相同⾃上⽽下,ID不同 值越⼤越先执⾏
2. select_type:表⽰select的类型,常见的取值有simple(简单表),primary(主查询),union(union中第⼆个或更后边的查询
语句),subquery(select/where之后包含了⼦查询);
3. type:表⽰连接类型 由好到差:null-system-const-eq_ref-ref-range-index-all
4. possible_key:表⽰可能⽤到的索引
5. key:实际⽤到的索引
6. key_len:表⽰索引中使⽤的字节数,该值为最⼤可能的长度并⾮实际使⽤长度
7. rows: MySQL认为必须要执⾏查询的⾏数
8. filtered:返回结果的⾏数占需读取⾏数的百分⽐,越⼤越好
索引有哪些
分类含义特点
聚集索引索引结构的叶⼦节点保存⾏数据有且只有⼀个mysql面试题基础知识
⼆级索引索引结构的叶⼦节点关联对应的主键可多个
分类含义特点
分类含义特点关键字
主键索引针对表中主键创建的索引默认创建,唯⼀primary
唯⼀索引避免同⼀个表中某数据列中的值重复可多个unique
常规索引快速定位特殊数据可多个
全⽂索引全⽂索引查的是⽂本中的关键字可多个fulltext Hash,B-tree,B+tree的优点
Hash索引底层就是hash表,进⾏查是调⽤⼀次hash函数就可以获取到相应的键值,B+树底层实现的是多路平衡⼆叉树,每次查都是从根节点出发查到叶⼦节点⽅可获的所查数据。
hash索引进⾏等值查询更快(⼀般情况下),但是却⽆法进⾏范围查询。
B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地⽅将会⼤⼤提⾼热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加⾼效。
B树只适合随机检索,B+树同时⽀持随机检索和顺序检索。由于B+树的内部节点只存放键,不存放值,因此,⼀次读取,可以在内存页中获取更多的键,有利于更快地缩⼩查范围。 ⽽且 B+树的叶节点由⼀条链相连 全数据遍历时效率更⾼
覆盖索引
查询使⽤了索引,在该索引中已经全部能够到, ⽽不需要从聚集索引中查询。
尽量使⽤覆盖索引减少select*
覆盖索引的好处
减少IO操作 当查询某字段时,需要先查询辅助索引,再查询聚集索引。如果在辅助索引中就到查询结果,就不需要查询聚集索引,这样明显减少IO操作。⽽且辅助索引的叶⼦结点不包含⾏记录的所有数据,也可以减少IO操作。
有利于统计 对于select count(*) from users这个查询表记录数的sql,通过遍历聚集索引和辅助索引都可以得到结果,但优化器会选择辅助索引,因为辅助索引需要的IO操作少于聚集索引。
创建索引的原则
1. 针对于数据量较⼤,且查询⽐较频繁的表建⽴索引
2. 针对于常作为查询添加,排序,分组操作的字段建⽴索引
3. 尽量选择区分度⾼的列作为索引,尽量建⽴唯⼀索引,区分度越⾼ 使⽤效率越⾼
4. 如果是字符串类型的字段,字段长度较长,可以针对字段的特点建⽴前缀索引
5. 尽量使⽤联合索引,减少单列索引
6. 要控制索引的数量,索引越多维护索引的代价也越⼤
7. 如果索引列不能存储Null值,请在创建表的时候使⽤Not Null约束它
索引失败的情况
最左前缀法则
如果索引了多列(联合索引),要遵循最左前缀法则。
即查询从索引的最左列开始,并且不跳过索引中的列;若跳过某⼀列,索引将部分失效(缺失部分的后边)。
范围查询
联合索引中,出现范围查询(> <),范围查询右侧的列索引失效
索引列运算
不要在索引列上进⾏运算操作,否则索引会失效
廖雪峰javascript教程字符串不加引号
字符串类型字段使⽤时不加引号,索引也会失效
模糊查询
如果是尾部模糊匹配索引不会失效,如果是头部模糊查询 索引会失效
or连接条件
如果or在前的条件中的列有索引,⽽后⾯的列中没有索引,那么涉及的索引都不会被⽤到
数据分布影响
如果MySQL评估使⽤索引⽐全表更慢,则不使⽤索引
SQL优化
在插⼊数据时,多条数据批量操作并且⼿动提交事务,⼤批量插⼊数据时使⽤MySQL数据库提供的load指令进⾏插⼊
对主键进⾏优化:主键存在页分裂和页合并
页分裂:主键乱序插⼊可能导致
页合并:删除记录时不是直接物理删除⽽是被标记
在满⾜业务的情况下尽量降低主键长度,插⼊时尽量顺序插⼊,避免对逐渐地修改
排序字段建⽴合适的索引,尽量使⽤覆盖索引;
尽量根据主键/索引字段进⾏数据更新
InnoDB存储结构
逻辑存储架构
表空间:⼀个mysql实例可以对应多个表空间,⽤于存储记录,索引等
段:分为数据段,索引段,回滚段;数据段就是B+ 树的叶⼦节点,索引段就是B+树的⾮叶⼦节点。段⽤来管理多个区
区:表空间的单元结构,默认情况下⼀个区中有64个连续的页
页:存储引擎磁盘管理的最⼩单元
⾏:数据按⾏存储
内存架构
Buffer pool:缓冲池是主内存中的⼀个区域,⾥⾯可以缓存磁盘上经常操作的真实数据,在执⾏增删改查操作时,先操作缓冲池中的数据,然后再以⼀定的频率刷新到磁盘,从⽽减少磁盘IO
缓冲池以页为单位,底层采⽤链表管理
Change Buffer:更改缓冲区,在执⾏DML语句时,如果这些数据没在缓冲池中就不会直接操作磁盘⽽是会将数据变更存在更改缓冲区,在未来数据被读取时,再将数据合并恢复到缓冲池中,这样可以减少磁盘IO
⾃适应Hash索引:⽤于优化缓冲池的数据查询,⽆需⼈⼯⼲预,是系统根据情况⾃动完成简单汇编语言程序
Log Buffer:⽇志缓冲区,⽤来保存要写⼊到磁盘中Log⽇志数据,会定期将⽇志刷新到磁盘中
磁盘结构
系统表空间:更改缓冲区的存储空间
⽂件表空间:包含单个表的数据和索引
通⽤表空间:需要⾃⼰创建
撤销表空间:MySQL实例在初始化阶段会⾃动创建两个默认的undo表空间 ⽤于存储undo log⽇志
临时表空间:InnoDB使⽤会话临时表空间和全局临时表空间存储⽤户创建的临时表
MVCC-多版本并发控制
当前读:读取的是记录的最新版本,读取时还保证其他并发事务不能修改当前记录,会对读取的记录进⾏加锁快照读:简单的select(不加锁) 就是快照读,读取的是记录数据的可见版本,有可能是历史数据
隐式字段
DB_TRX_ID 最近修改事务 ID:记录创建这条记录/最后⼀次修改该记录的事务 ID
DB_ROLL_PTR 回滚指针,指向这条记录的上⼀个版本,⽤于配个undo log指向上⼀个版本
DB_ROW_ID 隐含的⾃增 ID(隐藏主键),如果数据表没有主键将会⽣成该隐藏字段
undo log
回滚⽇志,在插⼊删除更新时,产⽣便于数据回滚的⽇志,
在insert时 产⽣的undo log只在回滚的时候需要,事务提交后就⽴刻删除
在update,delete时,产⽣的undo log不仅在回滚时需要,在快照读的时候也需要,不会被⽴刻删除readview
读视图是快照读执⾏时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id
字段含义
m_ids当前活跃的事务集合
min_trx_id最⼩活跃事务ID
max_trx_id预分配事务ID,当前最⼤事务ID+1
creator_trx_id ReadView创建这的事务ID