InnoDB

[灵魂拷问]MySQL面试高频100问(工程师方向)

倖福魔咒の 提交于 2021-01-13 08:49:59
作者:呼延十 juejin.im/post/5d351303f265da1bd30596f9 前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来. 因此决定搞一个MySQL灵魂100问,试着用回答问题的方式,让自己对知识点的理解更加深入一点. 此文不会事无巨细的从select的用法开始讲解mysql,主要针对的是开发人员需要知道的一些MySQL的知识点,主要包括索引,事务,优化等方面,以在面试中高频的问句形式给出答案. 索引相关 关于MySQL的索引,曾经进行过一次总结,文章链接在这里 Mysql索引原理及其优化. 1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时

[灵魂拷问]MySQL面试高频100问(工程师方向)

独自空忆成欢 提交于 2021-01-13 08:49:43
前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来. 因此决定搞一个MySQL灵魂100问,试着用回答问题的方式,让自己对知识点的理解更加深入一点.此文不会事无巨细的从select的用法开始讲解mysql,主要针对的是开发人员需要知道的一些MySQL的知识点,主要包括索引,事务,优化等方面,以在面试中高频的问句形式给出答案. 索引相关 1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值

[灵魂拷问]MySQL面试高频100问(工程师方向)

ぃ、小莉子 提交于 2021-01-13 08:47:04
前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉水. 前一阵系统的学习了一下MySQL,也有一些实际操作经验,偶然看到一篇和MySQL相关的面试文章,发现其中的一些问题自己也回答不好,虽然知识点大部分都知道,但是无法将知识串联起来. 因此决定搞一个MySQL灵魂100问,试着用回答问题的方式,让自己对知识点的理解更加深入一点.此文不会事无巨细的从select的用法开始讲解mysql,主要针对的是开发人员需要知道的一些MySQL的知识点,主要包括索引,事务,优化等方面,以在面试中高频的问句形式给出答案. 索引相关 1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值

每日一面

非 Y 不嫁゛ 提交于 2021-01-13 08:43:10
问题参考自: https://www.zhihu.com/question/425704691/answer/1524724367 ,答案为个人原创 其实就是 innodb_flush_log_at_trx_commit 和 sync_binlog 两个参数设置,都设置为 1 就是 双 1 设置 。MySQL 默认配置就是 双 1 配置 。 innodb_flush_log_at_trx_commit 是 innodb 引擎的配置, sync_binlog 是 MySQL 引擎上层的配置,都是控制磁盘写入策略。 MySQL innoDB 引擎在事务 commit 之后: binlog 写内存 redo log 写内存 根据这两个配置决定这两个日志是否刷盘(调用 fsync ) commit完成 innodb_flush_log_at_trx_commit :redo log 的刷盘策略,默认为 1 如果 innodb_flush_log_at_trx_commit 设置为 0: log buffer 将每秒一次地写入 log file 中,并且 log file 的 flush (刷到磁盘)操作同时进行.该模式下,在事务提交的时候, 不会主动触发写入磁盘 的操作; 如果 innodb_flush_log_at_trx_commit 设置为 1:每次事务提交时 MySQL 都会把

mysql为什么会选错索引

不打扰是莪最后的温柔 提交于 2021-01-13 07:54:00
CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`), KEY `b` (`b`) ) ENGINE=InnoDB; 用存储过程插入100000条数据 delimiter ;; create procedure idata() begin declare i int; set i=1; while(i<=100000)do insert into t values(i, i, i); set i=i+1; end while; end;; delimiter ; call idata(); mysql> select * from t where a between 10000 and 20000; set sql_long_query=0;这里表示接下来所有的查询都会进入到慢查询日志 select * from t where a between 10000 and 20000; /*Q1*/ select * from t force index(a) where a between 10000 and 20000;/*Q2*/ 第一条是全表扫描,第二条扫描了10000条 二

Mysql 练习题一

馋奶兔 提交于 2021-01-13 07:26:19
库操作: 1. 创建 数据库 create database db1; 2. 使用数据库 use db1 3. 查看表 show tables; 4. 删除 drop database db1 表操作: 创建一个表 create TABLE t1( name VARCHAR( 50 ) not null , age int NULL, salary DOUBLE( 5 , 2 ) ); 删除表 drop table t1 查询: SELECT * from t1 复制表 create table t2 select * from t1; # 复制表结构和数据, create table t3 like t1; #复制表结构 插入数据: insert into t2(name,age) VALUES("li", 19);    修改表字段: update t2 set name ="小风" where name ="li" 删除操作: delete from t2 where age =18 查询部门id为空的数据 SELECT * from person where dept_id IS NULL; and 语法 SELECT * from person where salary >4000 and age<=30; 区间查询. select * from person where

MySQL的逻辑查询语句的执行顺序

拥有回忆 提交于 2021-01-13 07:00:14
一. SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number> 二. SELECT语句关键字的执行顺序 (7 ) SELECT ( 8) DISTINCT <select_list> ( 1) FROM <left_table> ( 3) <join_type> JOIN <right_table> ( 2) ON <join_condition> ( 4) WHERE <where_condition> ( 5) GROUP BY <group_by_list> ( 6) HAVING <having_condition> ( 9) ORDER BY <order_by_condition> ( 10) LIMIT <limit_number> 三 准备表和数据 1. 新建一个测试数据库TestDB;   create database TestDB; 2

mysql数据库优化课程---15、mysql优化步骤(mysql中最常用最立竿见影的优化是什么)

时间秒杀一切 提交于 2021-01-13 05:41:10
mysql数据库优化课程---15、mysql优化步骤(mysql中最常用最立竿见影的优化是什么) 一、总结 一句话总结:索引优化最立竿见影 索引优化:不然有多少行要扫描多少次,1亿行大概是5到10分钟,和列的存量有关系 2、show status的作用是什么? 执行频率:mysql>show global status; global表示自数据库启动至今 了解各种sql的执行频率 通过show status命令了解各种SQL的执行频率。 格式:mysql> show [session|global]status; 其中:session(默认)表示当前连接, global表示自数据库启动至今 mysql>show status; mysql>show global status; mysql>show status like ‘Com_%’; mysql>show global status like ‘Com_%’; • 参数说明: • Com_XXX表示每个XXX语句执行的次数如: – Com_select 执行select操作的次数,一次查询只累计加1 – Com_update 执行update操作的次数 – Com_insert 执行insert操作的次数,对批量插入只算一次。 – Com_delete 执行delete操作的次数 • 只针对于InnoDB存储引擎的。 –

Mysql千万级大表优化

爷,独闯天下 提交于 2021-01-13 05:36:54
Mysql的单张表的最大数据存储量尚没有定论,一般情况下mysql单表记录超过千万以后性能会变得很差。因此,总结一些相关的Mysql千万级大表的优化策略。 1.优化sql以及索引 1.1优化sql 1、有索引但未被用到的情况(不建议) (1)避免 like的参数以通配符开头 时 尽量避免Like的参数以通配符开头,否则数据库引擎会放弃使用索引而进行全表扫描。 以通配符开头的sql语句,例如:select * from t_credit_detail where Flistid like '%0'\G 这是全表扫描,没有使用到索引,不建议使用。 不以通配符开头的sql语句,例如:select * from t_credit_detail where Flistid like '2%'\G 很明显,这使用到了索引,是有范围的查找了,比以通配符开头的sql语句效率提高不少。 (2) 避免where条件不符合最左前缀原则。最左前缀原则:mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整(IN和=可以乱序)。 (3) 使用!= 或 <> 操作符时

MySQL逻辑查询语句的执行顺序

南楼画角 提交于 2021-01-12 20:02:15
一 SELECT语句关键字的定义顺序 SELECT DISTINCT <select_list> FROM <left_table> <join_type> JOIN <right_table> ON <join_condition> WHERE <where_condition> GROUP BY <group_by_list> HAVING <having_condition> ORDER BY <order_by_condition> LIMIT <limit_number> View Code 二 SELECT语句关键字的执行顺序 (7 ) SELECT ( 8) DISTINCT <select_list> ( 1) FROM <left_table> ( 3) <join_type> JOIN <right_table> ( 2) ON <join_condition> ( 4) WHERE <where_condition> ( 5) GROUP BY <group_by_list> ( 6) HAVING <having_condition> ( 9) ORDER BY <order_by_condition> ( 10) LIMIT <limit_number> View Code 三 准备表和数据 1 .新建一个测试数据库TestDB; create