要是说不了解,接下来该聊些啥呀? 巴拉巴拉… MyISAM:非事务处理存储引擎 索引放在XX.MYI文件中,数据放在XX.MYD文件中。 InnoDB:具备外键功能的存储引擎 索引也是数据。数据和索引存在一个XX.IDB文件中。 Mermory:基于内存 Memory表至少比MyISAM表要快一个数量级,因为所有的数据都保存在内存中,不需要进行磁盘I/O。Memory表的结构在重启以后还会保留,但数据会丢失。 Archive:数据存档,数据插入后不能修改 针对高写入压缩做了优化的简单引擎。 优点: 缺点: InnoDB引擎有一个特殊功能叫“自适应哈希索引”。当InnoDB发现某些索引值被使用的非常频繁是,会在内存中基于B-Tree索引之上再建一个哈希索引,这样可以让B-Tree索引具有哈希索引的优点。这是一个完全自动的、内部的行为,用户无法控制或配置(如果有必要,可以关闭该功能)。 优点: 所有索引数据都在叶子结点上,并且增加了顺序访问指针,每个叶子节点都有指向相邻叶子节点的指针。 利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。 B-Tree中一次检索最多需要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。 假设叶子节点页可以存放100条记录,内部节点可以存放1000条目录,则 h=1,最多能放100条记录。 h=2,最多能放1000*100=100000条记录。 h=3,最多能放1000*1000*100=100000000(一亿)条记录。 h=4,最多能放1000*1000*1000*100=100000000000(一千亿)条记录,应该不会有这种数据量的表吧! 那为什么是O(logdN)呢?因为在页内查找一条记录时,使用的是二分查找。 表数据按照索引的顺序存储,也就是说索引项的顺序和表中记录的物理顺序一致。 聚簇索引叶子节点存储了真实的数据行,不在有单独的数据页。 一张表只能创建一个聚簇索引,因为物理存储顺序只能有一种。聚簇集指的是数据行和相关的键值都保存在一起。 如果主键不是自增ID,MySQL会不断的调整数据的物理地址、分页分裂、页合并。如果自增,只需要一页一页的写,索引结构相对紧凑,磁盘碎片少,效率高。 聚簇索引不是人为创建的,默认就有。 表数据存储顺序与索引顺序无关。叶子节点包含索引字段值及指向数据页数据行的逻辑指针(行的主键值)。 适当建立联合索引(索引列包含全部查找列)能达到不用回表即可获取数据的目的。 为了保证B+树的同一层内节点的目录项记录除页号字段外是唯一的,内节点需要增加主键字段,即二级索引内节点由三部分组成: 索引列的值 主键值 页号(页指针) 主键索引 普通索引,联合索引 唯一索引 回答这个问题,心里一定要有点B树🐶。 二叉查找树: 左子树不为空,则左子树节点值均小于根节点。 右子树不为空,则右子树节点值均大于根节点。 任意节点的左右子树也是二叉查找树。 没有键值相同的节点。 有可能会退化成一条线性链。 AVL树: AVL树是带有平衡条件的二叉查找树,一般用平衡因子差值判断是否平衡并通过旋转实现平衡。 左右子树高度差不超过1。 与红黑树相比,它是严格的平衡二叉树。 AVL树适合于插入删除比较少,但查找多的情况。 红黑树: B树(b-树) B+树 磁盘读写代价更低:内部节点只有指向下层节点的页指针(6个字节),因此内部节点相对B树更小,一页空间能容纳的关键字数量更多,I/O次数也就更少。 查询效率更稳定:任何关键字的查找必须走一条从根结点到叶子结点的路,所以每一个数据的查询效率相当。 利于数据库的扫描:B+树只需要遍历叶子节点就可以实现对全部关键字的扫描,更有利于范围查询。B树如果需要扫描,需要进行一次中序遍历,效率太低。 两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。 建立联合索引时,从左到右依次判断,如果左边列相同,则根据第二列的大小排列,多列以此类推。 想要找”二班的小Q“,因为不知道年级,所以需要遍历所有数据。 年级>=三 and 年级<=四 and 名字=小Q,因为不知道是几班的,所以要把三、四年级都遍历一遍,但是也用到了年级这个索引列,不用找其他年级。 如果期望order by的子句使用索引,后面的顺序也必须按照索引列的顺序给出。如:按照年级、班级、名字顺次取10位同学。 要是说没遇到过,面试官也不会以为你SQL学的好,他一定认为”渣渣,连慢查询都没写过🐶🐶🐶“。 建表随便一点,能达到事半功倍的效果。 建表不建索引,或者建了索引但是没有用上。 隐式类型转换。 select * where xxx=xxx 不管是啥,先查出来再说。 select xxx limit 100000 符合条件的数据有多少,全部拿出来,用不用再说。 join 各种表,连接一万遍。 为了展现强大的SQL水平,一条SQL要写一页,谁都别想看懂。 花样 like。 可能还有更高深的方法。。。 索引 SQL 建表 每一列都是not null:如果某一列可能存储null值,那么mysql需要额外维护一个null值列表,存储上,查询上都增加了成本。 能用固定长度数据类型解决的,不用变长类型。 表维护 定期将历史数据存档,表内数据维持在一定数量范围。 使用hash等方式分表。 默认隔离级别:repeatable-read 可重复读。 事务隔离级别为串行化时,读写数据都会锁住整张表。 事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。 事务隔离级别为读提交时,写数据只会锁住相应的行。 不可重复读重点在于update 幻读的重点在于insert MySQL中的行锁和表锁 一致性读 事务利用MVCC进行读取操作,称为一致性读、快照读或一致性无锁读。一致性读不会对表中记录进行加锁,其他事务可以自由对表中记录进行改动。 行级锁 共享锁 Share Locks,简称S锁。事务在读取一条记录时,需要先获取S锁。 独占锁 也叫排它锁,Exclusive Locks,简称X锁。事务要改动一条记录时,需要先获取该记录的X锁。 行级锁兼容性 表级锁 表级共享锁 表级独占锁 意向共享锁(IS锁) 给表上锁前需要知道表中有没有行锁,遍历又不是MySQL的风格,于是提出了意向锁。也就是在给某条记录加S锁时,需要先加一个表级别的IX锁。 意向独占锁(IX锁) 同理 表级锁兼容性 意向锁只是为了快速判断,意向锁之间都是兼容的。 主键通常添加AUTO_INCREMENT属性,系统实现自增的原理有两个: 执行插入操作时,在表级别加一个AUTO-INC锁,然后为每条记录分配递增值,该语句结束后再释放AUTO-INC锁,这样可以保证递增值是连续的。 AUTO_INC锁的作用范围只是insert语句,insert语句执行完就被释放了,不用等到事务结束。 采用轻量级的锁,在为insert语句生成递增值的时候获取一下轻量级锁,获取到后即可释放,不用等insert语句执行完毕再释放。 InnoDB提供一个 行锁的具体类型 普通行锁 间隙锁 官方名为LOCK_GAP,简称gap锁,仅仅是为了防止插入幻影记录而提出的。获取间隙锁后,其他事务不能在当前记录和相邻前一条记录的间隙中插入新记录。 MySQL在可重复读隔离级别下是可以解决幻读问题的: Next-Key Lock 官方名为LOCK_ORDINARY。既想锁住某条记录,又想阻止其他事务在该记录前面间隙插入新纪录。 插入意向锁 在插入数据时发现存在间隙锁,需要进行等待。在等待的时候需要在内存中生成插入意向锁。插入意向锁并不会阻止别的事务继续获取该记录上任何类型的锁(要它有啥用)。 MySQL服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行(两个线程)该日志文件保持与主服务器的数据一致。 主从同步的好处 同步方法 Statement Based Replication 基于SQL语句的复制,主服务器将SQL写到日志文件中 优点:日志文件小;记录了所有语句,方便审计。 缺点:sql中的函数语句不能正确复制;告警信息不能正确复制; Row Based Replication 基于行的复制,行变化作为事件写入二进制日志。 优点:最安全的复制方式;更少的行级锁 缺点:日志文件大;不能进行日志审计 Mixed Based Replication 混合,既使用SBR又使用RBR,默认SBR。 主库和从库执行相同的SQL,主库可以快速执行,为什么从库不行? master可以并发,但是slave的SQL线程只能顺序执行。当TPS较高时,产生的SQL超过slave一个SQL线程能承受的范围,延时就产生了。 MySQL主从同步解决方案 半同步复制——解决数据丢失问题,但会增加延迟。 默认是异步复制的方式,master并不关心slave数据有没有写入成功。 从库写入relay_log成功才返回ack消息,然后才返回客户端。 多库并行复制——解决从库复制延迟问题 多启了几个线程 持续更新…
面试官:“了解MySQL吗?”
面试官:“了解的话,那说说XXX吧。”
MySQL有哪些常见的引擎,说说他们的区别?
show engines; #查看支持的引擎
特点
InnoDB
MyISAM
Memory
Archive
b+树索引
yes
yes
yes
no
MVCC
yes
no
no
no
事务
yes
no
no
no
存储限制
64TB
256TB
RAM
None
索引缓存
yes
yes
本身就是缓存
No
外键
yes
no
no
no
锁粒度
row
table
table
row
全文索引
yes
yes
no
no
数据缓存
yes
no
本身就是缓存
no
有哪些索引和他们之间的区别?
Hash索引
B+树索引
全文索引
聚集索引(聚簇索引)
非聚集索引(二级索引)
alter table table_name add primary key (column name);
create index 索引名 on table_name(column1,column2); alter table table_name add index 索引名(column1,column2);
create unique index index_name on table_name (column_list);
为什么要使用索引?
建索引、使用索引要注意什么?
B+树有什么特点?为什么B+树更适合做索引?
那么为什么是B+树?
InnoDB的B+树索引
说说什么是最左匹配,对组合索引的理解
有没有遇到过慢查询,如何优化?
怎么更容易的写出慢查询?
优化
Mysql有哪几种事物隔离级别及区别?
事务基本要素
事务隔离级别
隔离级别
脏读
不可重复读
幻读
读未提交read-uncommitted
是
是
是
不可重复读read-committed
否
是
是
可重复读repeatable-read
否
否
是
串行化serializable
否
否
否
不可重复读和幻读
Mysql中的锁
ALTER TABLE
、DROP TABLE
这类的DDL
语句时,其他事务对这个表并发执行诸如SELECT
、INSERT
、DELETE
、UPDATE
的语句会发生阻塞,反之也会发生阻塞。这个过程通过在server层使用元数据锁(MDL)实现。
select ... lock in share mode;
select ... for update;
兼容性
X
S
X
No
No
S
No
Yes
兼容性
X
S
IX
IS
X
No
No
No
No
S
No
Yes
No
Yes
IX
No
No
Yes
Yes
IS
No
Yes
Yes
Yes
表级别AUTO-INC锁
innodb_autoinc_lock_mode
系统变量,值为0时,一律采用AUTO-INC锁;值为2时,一律采用轻量级锁(不安全);值为1时,在插入记录数量确定时采用轻量级锁,不确定时使用AUTO-INC锁。
Mysql主从是怎么同步的?
MySQL主从同步延迟问题
show status # Seconds_Behind_Master查看从库落后多长时间
常见主从延迟原因及解决方案
MySQL中varchar与char的区别以及char(10)中的10代表的涵义?
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算