InnoDB支持事务,MyISAM不支持
InnoDB支持外键,MyISAM不支持
InnoDB是聚簇索引,MyISAM是非聚簇索引
MyISAM把索引和数据分开存储,索引放xx.myi文件中(数据地址),数据存放在xx.myd文件中。InnoDB数据和索引都存在一个xx.idb文件中。
InnoDB不保存全表的具体行数,执行select count(*) from table 时需要全表扫描;而MyISAM用一个变量保存了整个表的行数,因此速度很快(注意不能加where)
InnoDB不支持全文索引,而MyISAM支持(5.7以后InnoDB支持了)
MyISAM只支持表级锁,InnoDB支持行级锁,InnoDB的行锁是实现在索引上的,而不是锁在行记录上。即如果没有命中索引,也会退化为行锁
InnoDB必须有唯一索引(如主键),如果没有指定的话会自己生成一个隐藏列row_id来充当默认主键,而MyISAM可以没有
InnoDB具有更好的容灾策略
B树:每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null:
B+树:只有叶子节点存储data,叶子节点包含了这棵树所有的键值,叶子节点不存储指针。
后来在B+树上增加了顺序访问指针(双向链表),也就是每个叶子节点增加一个指向相邻叶子节点的指针。
这样一来我们就看到了B+树的好处:
1,非叶子节点不存储数据保证一次IO能取到更多的节点,减少IO次数,更快找到要查找的数据
2,底部的双向链表更适合我们进行顺序查找和索引排序
先来看一下联合索引在B+树中是如何排序的:
由图中可以看出,联合索引中B+树会先对第一个字段进行排序,在第一个字段相同的情况下再对第二个字段进行排序,更多字段的联合索引以此类推。假如有A,B,C三字段联合索引,以下是几种索引失效的情况:
还有其他几种情况导致的索引失效:
自增ID可以保证每次插入B+Tree时索引是从右边扩展的,可以避免B+树频繁的合并和分裂。如果使用字符串主键和随机主键,会使得数据随即插入,效率较差。
索引覆盖指的是再一次查询中,如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为覆盖索引,而不需要再回表查询。(从6中联合索引排序就可以看出,如果达不到索引覆盖的条件,将会在找到第一个符合条件的数据之后,再次回表查询这些数据中符合后续条件的数据)
mysql锁分为共享锁和排他锁,也叫读锁和写锁。
读锁是共享的,可以通过lock in share mode实现【例:select * from user lock in share mode】,这个时候只能读不能写。
写锁是排它的,它会阻塞其他写锁和读锁,从颗粒度来分,可以分为表锁和行锁两种。
多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。
假如有一个客户表,用户名不可重复,事务A在插入username=张三时,先查询了表中有无张三的信息,确认没有之后执行insert操作,这时事务B新插入了一条张三导致A出现唯一索引冲突,插入失败,这种情况就是幻读。
间隙锁是可重复度级别下才会有的锁,结合MVCC和间隙锁可以解决幻读的问题。假设User表现在有如下几条记录:
id(主键索引) | age |
---|---|
10 | 18 |
20 | 18 |
30 | 18 |
而现在有两个事务同时操作这个表(时间依次向下):
事务A | 事务B |
---|---|
select * from user where id = 20 for update; |
|
insert into user values(10,20) --成功 | |
insert into user values(11,20) --失败 | |
insert into user values(13,20) --失败 | |
insert into user values(20,20) --失败 |
这时事务B只有第一条插入语句可以插入成功,因为表的间隙mysql自动帮我们生成了区间(左开右闭)。如事务A的操作生成的间隙锁区间就是(10,20],所以id为10的记录可以插入,而20插不进去。
需要注意的是唯一索引是不会有间隙锁的。
首先分库分表分为垂直和水平两种方式,一般来说我们拆分的顺序是先垂直后水平。
垂直分库
基于现在微服务拆分来说,都是已经做到了垂直分库了。例如用户模块使用用户数据库,项目模块使用项目库。
垂直分表
如果表字段比较多,将不常用的,数据较大的等等做拆分。
水平分表
首先根据业务场景来决定使用什么字段作为分表字段(sharding_key),比如我们现在日交易2kw,可以用user_id作为sharding_key,数据查询支持到最近1个月的交易,超过一个月的做归档处理,那么一个月的数量就是6E,可以分为512张表,那么每张表的数据就在100万左右。
比如用户id为100,那都经过hash(100),然后对512取模,就可以落到对应的表上了。
1,分布式ID,自己实现一套分布式ID生成算法或者使用开源的比如雪花算法这种
2,分表后不使用主键作为查询依据,而是每张表单独新增一个字段作为唯一主键使用,比如订单表订单号是唯一的,不管最终落在哪张表都基于订单号作为查询依据,更新也一样。
比如要按机构查询客户,这时我们可以做一个机构用户映射表,通过机构号查询到用户列表,再通过user_id去查询。
首先先了解mysql主从同步的原理:
由于mysql默认的复制方式是异步的,主库把日志发送给从库后不关心从库是否已经处理,这样会产生一个问题就是假设主库挂了,从库处理失败,这时从库上升为主库后,日志就丢失了。由此产生两个概念:
首先,尽量保证查询SQL走索引:
如果还是有慢SQL,就开启慢查询日志,查看服务运行时哪条SQL运行速度慢
找出运行速度慢的SQL,使用explain执行计划分析,主要看rows,key,type等字段,type中关键字如下:
在进行执行计划调优时,应尽量保证查询中每一个语句至少是ref级别的。
mysql和hive的区别(Hive与传统数据库的区别)?
Hive采用了类SQL的查询语言HQL(hive query language)。除了HQL之外,其余无任何相似的地方。Hive是为了数据仓库设计的。
存储位置:Hive在Hadoop上;Mysql将数据存储在设备或本地系统中;
数据更新:Hive不支持数据的改写和添加,是在加载的时候就已经确定好了;数据库可以CRUD;
索引:Hive无索引,每次扫描所有数据,底层是MR,并行计算,适用于大数据量;MySQL有索引,适合在线查询数据;
执行:Hive底层是MapReduce(大数据计算框架);MySQL底层是执行引擎;
可扩展性:Hive:大数据量,慢慢扩去吧;MySQL:相对就很少了
参考博客:
InnoDB和MyISAM区别:https://blog.csdn.net/qq_35642036/article/details/82820178
面试题:https://blog.csdn.net/m0_45270667/article/details/108950184
B和B+树区别:https://blog.csdn.net/zhuanzhe117/article/details/78039692
MVCC:https://www.jianshu.com/p/8845ddca3b23
:
InnoDB和MyISAM区别:https://blog.csdn.net/qq_35642036/article/details/82820178
面试题:https://blog.csdn.net/m0_45270667/article/details/108950184
B和B+树区别:https://blog.csdn.net/zhuanzhe117/article/details/78039692
MVCC:https://www.jianshu.com/p/8845ddca3b23