做为后端猿的咱们,不出意外天天都会和mysql打交道。除了天天写不腻的CURD语句,关于mysql咱们应该要了解它的那些基础知识呢?mysql
接 入 层 ----------------------- ⬆ ⬆ ⬇ ⬇ 缓 存 解 析 器 ⬆ ⬇ 优 化 器 ----------------------- 引 擎
InnoDBsql
MyISAM数据库
Memory后端
Archive安全
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read Uncommitted | √ | √ | √ |
Read Committed | × | √ | √ |
Repeatable Read | × | × | √ |
Serializable | × | × | × |
MVCC:Multi Version Concurrency Control, 多版本并发控制,mysql防止幻读的一种技术手段。每行数据存在间隙行,间隙行存放该行数据的建立时间,删除时间,这里的时间实际是事务的版本号。当,数据结构
死锁产生的缘由是两个事务互相等待对方释放,产生了循环依赖,mysql采用了死锁检测(检测到循环依赖返回错误)和死锁超时(超时回滚持有行锁最少的事务)的方式尽量去避免死锁。例如:架构
行锁: UPDATE `table_demo` SET `a` = 'test' WHERE `b` = 'lalala'; UPDATE `table_demo` SET `b` = 'test' WHERE `a` = 'lalala'; UPDATE `table_demo` SET `b` = 'test' WHERE `a` = 'lalala'; UPDATE `table_demo` SET `a` = 'test' WHERE `b` = 'lalala';
覆盖索引:要查询的行被索引覆盖,从索引中能够直接读取,不须要回表查询。例如:并发
CREATE TABLE `demo_table`( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID', `username` char(32) NOT NULL DEFAULT '' COMMENT '用户名', `password` char(32) NOT NULL DEFAULT '' COMMENT '密码', PRIMARY KEY (`id`), KEY `idx_username` (`username`) )ENGINE=InnoDB DEFAULT CHARSET=UTF8;
explain select `username` from `demo_table` where `username` = 'demo'; +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+ | 1 | SIMPLE | demo_table | ref | idx_username | idx_username | 96 | const | 1 | Using where; Using index | +----+-------------+------------+------+---------------+--------------+---------+-------+------+--------------------------+
Extra里的Using index就是使用了覆盖索引的意思。spa
我的目前理解:例如使用联合索引,从左向右依次匹配,未匹配到索引字段或第一个范围查找(between、like、大于、小于)为止,及该部分索引有效。指针
红黑树本质是二叉树,每一个节点最多拥有两个子节点,因此红黑树的深度较深。
B树每一个节点最多能够有n个子节点,根节点常驻内存且每一个节点恰好申请1个页的大小,假如每一个节点拥有100个子节点,那百万级的数据咱们基本上只须要深度是3就能够存下 => 100^3,这样就减小的io次数(一个节点的大小一般为磁盘一个页的大小)。
又有“局部性原理”(一旦一个数据被查询,那么它附近的数据可能也会须要被查询),其次B+树的叶子节点构成一个链表,这样咱们就能够很容易的查询出一段范围的数据,其次B+树的根节点和内部节点只存放该索引下一个子节点的位置的指针,数据只存放在叶子节点里,这样非叶子节点就能够有更多的空间存放索引的位置,索引的范围就能够尽量的大,从而树的深度就可能的小。
后续持续修正和补充,若是有什么写的不对的地方欢迎你们积极指正,谢谢你们。
扫面下方二维码关注个人技术公众号,及时为你们推送个人原创技术分享