InnoDB

MySQL数据库最全知识点+面试题整理

主宰稳场 提交于 2020-10-24 16:18:49
数据库,尤其是关系型数据库,是程序员日常使用最多的。对优秀的工程师来讲,只会 CRUD 还不够,还需要理解其原理,理解其原理能够让程序员写出更加可靠高效的代码,并能够提升解决实际问题的能力,本篇文章将以 MySQL为例,和大家一起学习数据库原理。 数据库基础知识 1. 为什么要使用数据库 数据保存在内存 优点:存取速度快 缺点:数据不能永久保存 数据保存在文件 优点:数据永久保存 缺点:1)速度比内存操作慢,频繁的IO操作 2)查询数据不方便 数据保存在数据库 1)数据永久保存 2)使用SQL语句,查询方便效率高 3)管理数据方便 2. 什么是SQL? 结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。作用:用于存取数据、查询、更新和管理关系数据库系统。 3. 什么是MySQL? MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。 数据库三大范式是什么 mysql有关权限的表都有哪几个

MySQL性能调优my.cnf详解(mysql5.6版本)

╄→尐↘猪︶ㄣ 提交于 2020-10-24 12:58:18
提供一个MySQL 5.6版本适合在1GB内存服务器上的my.cnf配置文件下载地址: http://blog.linuxeye.com/wp-content/uploads/2013/11/my.cnf [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/mysql datadir = /data/mysql pid-file = /data/mysql/mysql.pid user = mysql bind-address = 0.0.0.0 server-id = 1 #表示是本机的序号为1,一般来讲就是master的意思 skip-name-resolve # 禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意, 如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求 #skip-networking back_log = 600 # MySQL能有的连接数量。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以 被存在堆栈中。如果期望在一个短时间内有很多连接,你需要增加它。也就是说

面试收获美团offer的学习笔记:MySQL+Spring+JVM+多线程并发等

痞子三分冷 提交于 2020-10-24 12:22:14
从去年到今年先后面试了 6 次美团,外卖、订单、商旅面试了好几个部门、总结下来面试的大体思路真的基本一致诶。比如: JVM 参数配置、常用调试工具、分区、类加载,还会问你有需要线上的调试问题吗?遇到死循环 CPU 飙升怎么解决? Java 并发包常用工具用法和原理、会配合集合类一起考,对了还会有 volatile、CAS 原理等。 MySQL 也算是必备了,索引存储结构、索引搜索原理、事务的隔离级别和原理,这些真的是逢考必问。当然除了 MySQL,Redis 和 ES 也是面试长文的,大多都是集中到原理。比如 ES 倒排索引、分片原理,Redis 的 zset 原理和使用场景、多路复用、穿透、熔断等等。 框架也是必备的知识点,最常见的就是 AOP 原理,自己怎么实现?Spring Boot 啥原理?框架通常会配合设计模式一起考,比如你最熟悉的设计模式是啥?Spring MVC 里面用了什么设计模式?解决了什么问题? 接下来最重要的就是服务治理了,这里面内容就太多了,Dubbo 也好,Spring Cloud 也罢,总之这个地方最能看得出你真实的工作经验和问题的考虑深度,毕竟没有真正在庞大的系统里面锻炼过真的很难应付这个地方。 没漏掉还有一个最重要的算法,这个就靠平时多练了,LeetCode 中文版上线了,一天一道题,面试必无敌。 说了这么多只有一个重点,就是无论大厂他有没有题库

阿里面试官让我谈谈:Mysql中的降序索引底层实现,简单!

狂风中的少年 提交于 2020-10-24 09:58:05
什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集。 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1 ( b , c , d ) ; 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引。 但是大家不知道的是,上面这个sql实际上和下面的这个sql是等价的: create index idx_t1_bcd on t1 ( b asc , c asc , d asc ) ; asc 表示的是升序,使用这种语法创建出来的索引叫做 升序索引 。也就是我们平时在创建索引的时候,创建的都是升序索引。 可能你会想到,在创建的索引的时候,可以针对字段设置asc,那是不是也可以设置desc呢? 当然是可以的,比如下面三个语句: create index idx_t1_bcd on t1 ( b desc , c desc , d desc ) ; create index idx_t1_bcd on t1 ( b asc , c desc , d desc ) ; create index idx_t1_bcd on t1 ( b asc , c asc , d desc ) ; 这种语法在mysql中也是支持的,使用这种语法创建出来的索引就叫 降序索引 。 关键问题是: 在Mysql8

MySQL中group by 与 order by 一起使用排序问题

孤人 提交于 2020-10-23 21:32:35
假设有一个表:reward(奖励表),表结构如下: CREATE TABLE test.reward ( id int ( 11 ) NOT NULL AUTO_INCREMENT, uid int ( 11 ) NOT NULL COMMENT ' 用户uid ' , money decimal ( 10 , 2 ) NOT NULL COMMENT ' 奖励金额 ' , datatime datetime NOT NULL COMMENT ' 时间 ' , PRIMARY KEY (id) ) ENGINE = INNODB AUTO_INCREMENT = 1 CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT = ' 奖励表 ' ; 表中数据如下: 现在需要查询每个人领取的最高奖励并且从大到小排序: 如果直接查询: SELECT id, uid, money , datatime FROM reward GROUP BY uid ORDER BY money DESC ; 得到如下结果: 没有得到我们需要的结果, 这是因为group by 和 order by 一起使用时,会先使用group by 分组,并取出分组后的第一条数据,所以后面的order by 排序时根据取出来的第一条数据来排序的

mysql 一次数据更新过程(undo redo binlog 内存缓冲池扮演了什么角色)

筅森魡賤 提交于 2020-10-23 19:41:58
介绍 本篇博文是自己学习 儒猿技术窝) ​​​​​中:《从零开始带你成为MySQL实战优化高手》专栏课程,进行的总结,因为老师写的很好,所以很大一部分直接拿过来使用。 如果想学习完整的知识,请支持正版,地址: 从零开始带你称为MySQL实战优化高手(儒猿技术窝) 本文主要讲解了一次数据更新在mysql中经历了哪些过程。 先直接看下我们会讲到哪些步骤,文章中 主要有以下9个步骤: (1)更新语句经过 解析,优化 生成执行计划,交由执行器调用存储引擎接口(注:执行器会多次调用存储引擎接口,并不是一次完成) (2)查询旧值,先去内存缓冲区查看是否有数据,如果没有,从磁盘中加载到内存,并将旧值写入到 Undo log 日志中,用于回滚数据 (3)更新内存中的数据(注:磁盘仍为旧数据) (4)将操作写入到Redo Log 中 (5)Redo Log根据刷盘策略刷到磁盘 (6)准备提交事务,写入binlog 日志(注:binlog也有自己的刷盘策略) (7)把本次更新对应的binlog文件名称和这次 更新的binlog日志在文件里的位置,都写入到redo log日志文件里去,同时在redo log日志文件里写入一个commit标 记。 (8)事务完成 (9)mysql会有个后台线程将内存数据刷入到磁盘 整体的流程图如下: 更新语句 首先假设我们有一条SQL语句是这样的: update

MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序

时光总嘲笑我的痴心妄想 提交于 2020-10-23 08:35:24
MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序 What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构。 索引可以让我们避免一行一行进行全表扫描。它的价值就是可以帮助你对数据进行快速定位。 索引分类 按照 功能逻辑 来分 普通索引 INDEX(col_name) 或者 key index_name(col_name) 没有任何约束,一张表可以有多个普通索引 唯一索引 UNIQUE INDEX index_name(col_name) 在不同索引上增加了唯一约束,允许多个ull值 主键索引 PRIMARY KEY (col_name) 主键约束=UNIQUE+NOT NULL,一张表只能有一个主键索引---该性质由主键索引的物理实现方式决定---数据在文件中只能按照一种顺序进行存储 外键索引 CONSTRAINT foreign_key_name FOREIGN KEY(col_name) REFREENCES table_name(col2_name) 全文索引 FULLTEXT INDEX index_name(col_name)...)ENGINE=MyISAM; MySQL自带的全文索引仅支持英文,一般我们使用专门的全文搜索引擎Elasticsearch或者solr。 按照 物理实现 方式来分(也是按照叶子结点的内容来分)

覆盖索引、联合索引、索引下推

泪湿孤枕 提交于 2020-10-22 17:52:26
面试三轮我倒在了一道sql题上——sql性能优化 一、前言 最近小农在找工作,因为今年疫情的特殊原因,导致工作不是特别好找,所以一旦有面试电话,如果可以,都会去试一试,刚好接到一个面试邀请,感觉公司还不错,于是就确定了面试时间,准备了一下就去面试了。 第一轮面试是小组组长面试,通过。 第二轮是经理面试也是通过了。 第三轮总监面试,前面都还有模有样,突然画风一转,面试官说:“问你最后一个问题” 面试官:10W条数据,我要从其中查出100条不连续的数据,给你id,来查name和password进行展示,如何才能高性能的去使用? 我:在id上建立聚簇索引,然后用 in id 来缩小表搜索范围,最后 使用条件查询 小于最大id,大于最小id,这样可以让sql速度能够比较快的展示,虽然In的性能比较低 心里活动:雕虫小技,还最后一个问题,这样的问题再来一个吧 只见面试官紧锁眉头,与我心里期待的表情有点不一样啊,难道是哪个环节出了问题? 面试官:这样的性能不能达到最优化的程度,而且如果我给你的最小id是1,最大id是100000呢? 你这就有点杠精了啊,那行吧,你是面试官你说了算 我:既然id已经给出来了,而且只查询两个字段,用聚簇索引那么查询数据是很快的,用in id应该是可以的。 面试官:好的,回去等通知吧 我。。。。。 二、后知 于是回去后,查询资料,才知道原来面试官,真正想考的是

MySQL 8.0.22正式发布

狂风中的少年 提交于 2020-10-22 17:36:30
MySQL的最新版本8.0.22于2020年10月19日正式发行。这一版本里面有哪些变化,让我们快速浏览一下。 审计日志的改进 :对于JSON格式的日志文件,MySQL企业审计支持使用audit_log_read()用户定义函数进行日志读取操作。之前,只有通过向audit_log_read()传递一个参数才能指定开始读取的位置,为了更加灵活现在可以命名一个以时间戳的开始说明符,以便从该时间戳或之后的第一个事件开始读取。 MySQL企业版现在包含一个 keyring_oci插件 ,它使用Oracle Cloud Infrastructure Vault作为密钥环存储的后端。密钥信息不会永久存储在MySQL服务器本地存储中。 优化器部分 : prepared语句现在只在执行PREPARE时准备一次,而不是在每次执行时准备一次。此外,存储过程里面的语句也仅在初次执行时准备一次。 filesort算法现在支持对多个表上的联接进行排序,而不仅仅是对单个表进行排序。 在MySQL 8.0.22中,服务器在内部将所有右连接实例处理为左连接,消除了一些在解析时没有执行完整转换的特殊情况。 增加了支持SELECT INTO DUMPFILE 和 SELECT INTO OUTFILE 在写入文件时定期同步。 MySQL现在为符合条件的查询实现派生条件下推,将外部where条件推入派生表。 SQL语法

一文搞懂MySQL行锁、表锁、间隙锁详解

江枫思渺然 提交于 2020-10-22 10:38:24
准备工作 创建表 tb_innodb_lock drop table if exists test_innodb_lock; CREATE TABLE test_innodb_lock ( a INT (11), b VARCHAR (20) ) ENGINE INNODB DEFAULT charset = utf8; insert into test_innodb_lock values (1,'a'); insert into test_innodb_lock values (2,'b'); insert into test_innodb_lock values (3,'c'); insert into test_innodb_lock values (4,'d'); insert into test_innodb_lock values (5,'e'); 创建索引 create index idx_lock_a on test_innodb_lock(a); create index idx_lock_b on test_innodb_lock(b); MySQL 各种锁演示 先将自动提交事务改成手动提交: set autocommit=0; 我们启动两个会话窗口 A 和 B,模拟一个抢到锁,一个没抢到被阻塞住了。 行锁(写&读) A 窗口执行 update test