mysql相关内容学习总结整理
2022-08-26 09:45:53 0 举报
AI智能生成
mysql知识整理脑图
作者其他创作
大纲/内容
架构
架构图
子主题
插件式的存储引擎架构
将查询处理和其它的系统任务以及数据的存储提取相分离<br>
组成结构
连接层<br>
服务层<br>
引擎层<br>
存储层<br>
mysql的查询流程
1.客户端访问<br>
2.连接器<br>
验证身份,授予权限<br>
3.查询缓存<br>
mysql高版本后取消缓存功能8之后取消的<br>
4.分析器<br>
对sql语法进行分析
5.优化器
对执行的sql选择最优的执行方案
6.执行器<br>
执行当前sql,执行前会判定当前人是否有执行权限<br>
7.去引擎层获取数据并进行返回
流程图
子主题
存储引擎
概念
操作<br>
查看存储引擎<br>
设置存储引擎
查看数据文件存储位置
存储引擎类型
InnoDB(mysql5.5之后默认存储引擎)<br>
事务方面的支持
支持行锁
支持事务
支持外键
文件存储结构
.frm文件<br>
.ibd/.ibdata文件<br>
.ibd文件
.ibdata文件
数据页
InnoDB 存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。
特性
插入缓冲(insert buffer)<br>
二次写(double write)
自适应哈希索引(ahi)
预读(read ahead)
MyISAM<br>
事务方面支持
只支持表锁
不支持事务
不支持外键
文件存储结构
.frm文件<br>
.MYD文件<br>
.MYI文件<br>
Memory<br>
支持Hash索引<br>
NDB<br>
支持Hash索引
相关面试题
1.InnoDB和MyISAM的区别
1.InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;
2.InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;
3.InnoDB 是聚簇索引,MyISAM 是非聚簇索引。<br>
4.InnoDB 不保存表的具体行数<br>
5.InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。
细节对比
主外键
事务
锁<br>
缓存<br>
表空间大小<br>
关注点<br>
2.一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?
3.哪个存储引擎执行 select count(*) 更快,为什么?<br>
MyISAM更快,因为MyISAM内部维护了一个计数器,可以直接调取。<br>
数据类型
数值类型
整型
BIT<br>
BOOL
TINY INT
SMALL INT
MEDIUM INT
INT
BIG INT
浮点型
FLOAT
DOUBLE
DECIMAL
类型图解
<br>
字符串类型
char
CHAR<br>
VARCHAR
text
TINY TEXT
TEXT
MEDIUM TEXT
LONGTEXT
Blob
TINY BLOB
BLOB
MEDIUM BLOB
LONG BLOB
类型图解
子主题
日期类型<br>
Date
DateTime
TimeStamp
Time
Year
类型图解
其他数据类型<br>
BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection<br>
面试题
CHAR 和 VARCHAR 的区别?<br>
1.char是固定长度,varchar长度可变:
2.char(n) 和 varchar(n) 中括号中 n 代表字符的个数,并不代表字节个数,比如 CHAR(30) 就可以存储 30 个字符
3.存储时,前者不管实际存储数据的长度,直接按 char 规定的长度分配存储空间;而后者会根据实际存储的数据分配最终的存储空间
相同点
char(n),varchar(n)中的n都代表字符的个数<br>
超过char,varchar最大长度n的限制后,字符串会被截断。
不同点
char不论实际存储的字符数都会占用n个字符的空间,而varchar只会占用实际字符应该占用的字节空间加1(实际长度length,0<=length<255)或加2(length>255)。因为varchar保存数据时除了要保存字符串之外还会加一个字节来记录长度(如果列声明长度大于255则使用两个字节来保存长度)。<br>
能存储的最大空间限制不一样:char的存储上限为255字节2^8-1,varchar上限是65535字节2^16-1<br>
char在存储时会截断尾部的空格,而varchar不会。
char是适合存储很短的、一般固定长度的字符串。例如,char非常适合存储密码的MD5值,因为这是一个定长的值。对于非常短的列,char比varchar在存储空间上也更有效率。
列的字符串类型可以是什么?
字符串类型是:SET、BLOB、ENUM、CHAR、CHAR、TEXT、VARCHAR
BLOB和TEXT有什么区别?<br>
BLOB是一个二进制对象,可以容纳可变数量的数据。有四种类型的BLOB:TINYBLOB、BLOB、MEDIUMBLO和 LONGBLOB
<span style="color: rgb(64, 64, 64); font-family: -apple-system, BlinkMacSystemFont, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px;">TEXT是一个不区分大小写的BLOB。四种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT</span>
BLOB 保存二进制数据,TEXT 保存字符数据。<br>
索引
索引的概念
索引的目的
索引存储位置
索引操作<br>
创建索引
修改表结构(添加索引)
添加主键索引
添加唯一索引<br>
添加普通索引
添加全文索引
删除索引<br>
查看索引
索引分类
数据结构角度<br>
B+树索引<br>
Hash索引<br>
Full-Text全文索引<br>
R-Tree索引
物理存储角度
聚集索引
非聚集索引
逻辑角度
主键索引<br>
普通索引或者单列索引
多列索引(复合索引、联合索引)
唯一索引或者非唯一索引
空间索引<br>
索引的优劣
好处
提高数据检索效率,降低数据库IO成本
降低数据排序的成本,降低CPU的消耗<br>
劣势
索引也是一张表,保存了主键和索引字段,并指向实体表的记录,所以也需要占用内存
虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段, 都会调整因为更新所带来的键值变化后的索引信息
mysq索引结构
B+Tree
B+Tree和B-Tree的区别
B-Tree
使用场景
B-Tree是为磁盘等外存储设备设计的一种平衡查找树<br>
InnoDB 存储引擎中有页(Page)的概念,页是其磁盘管理的最小单位。InnoDB 存储引擎中默认每个页的大小为16KB,可通过参数 innodb_page_size 将页的大小设置为 4K、8K、16K,在 MySQL 中可通过如下命令查看页的大小:show variables like 'innodb_page_size';<br>
特性
一棵m阶的B-Tree有如下特性:<br>
<span style="color: rgb(64, 64, 64); font-family: -apple-system, BlinkMacSystemFont, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px;">每个节点最多有m个孩子</span><br>
除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。<br>
若根节点不是叶子节点,则至少有2个孩子<br>
所有叶子节点都在同一层,且不包含其它关键字信息<br>
每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
关键字的个数n满足:ceil(m/2)-1 <= n <= m-1<br>
ki(i=1,…n)为关键字,且关键字升序排序<br>
Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)
B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值
示意图
B+Tree
B+Tree相对于B-Tree的不同<br>
非叶子节点只存储键值信息;<br>
所有叶子节点之间都有一个链指针;
数据记录都存放在叶子节点中<br>
使用场景
InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为10^3)。也就是说一个深度为3的B+Tree索引可以维护10^3 * 10^3 * 10^3 = 10亿 条记录。<br>
示意图
B+Tree结构
通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。<br>
可以对B+Tree进行两种查找运算:
一种是对于主键的范围查找和分页查找
一种是从根节点开始,进行随机查找。
MyISAM主键索引与辅助索引的结构
MyISAM引擎的索引文件和数据文件是分离的
MyISAM引擎索引结构的叶子节点的数据域,存放的并不是实际的数据记录,而是数据记录的地址
索引文件与数据文件分离,这样的索引称为非聚簇索引<br>
MyISAM的主索引与辅助索引区别并不大,只是主键索引不能有重复的关键字。
在MyISAM中,索引(含叶子节点)存放在单独的.myi文件中,叶子节点存放的是数据的物理地址偏移量(通过偏移量访问就是随机访问,速度很快)
主索引是指主键索引,键值不可能重复;辅助索引则是普通索引,键值可能重复。
通过索引查找数据的流程:先从索引文件中查找到索引节点,从中拿到数据的文件指针,再到数据文件中通过文件指针定位了具体的数据。辅助索引类似。
示意图
InnoDB主键索引与辅助索引的结构
InnoDB引擎索引结构的叶子节点的数据域,存放的就是实际的数据记录<br>
InnoDB的数据文件本身就是主键索引文件,这样的索引被称为聚簇索引<br>
一个表只能有一个聚簇索引
主键索引
在Innodb中,索引分叶子节点和非叶子节点,非叶子节点就像新华字典的目录,单独存放在索引段中,叶子节点则是顺序排列的,在数据段中。Innodb的数据文件可以按照表来切分(只需要开启innodb_file_per_table),切分后存放在xxx.ibd中,默认不切分,存放在xxx.ibdata中<br>
辅助(非主键)索引
示意图
Hash索引
Hash算法<br>
检索算法
MySQL目前有Memory引擎和NDB引擎支持Hash索引
full-text全文索引<br>
概念
全文索引的作用<br>
实现方式
R-Tree空间索引<br>
概念
索引的建立选择
需要建立索引的情况
1.主键自动建立唯一索引<br>
2.频繁作为查询条件的字段<br>
3.查询中与其他表关联的字段,外键关系建立索引
4.单键/组合索引的选择问题,高并发下倾向创建组合索引<br>
5.查询中排序的字段,排序字段通过索引访问大幅提高排序速度
6.查询中统计或分组字段
不需要建立索引的情况
1.表记录太少<br>
2.经常增删改的表
3.数据重复且分布均匀的表字段,只应该为最经常查询和最经常排序的数据列建立索引(如果某个数据类包含太多的重复数据,建立索引没有太大意义)<br>
4.频繁更新的字段不适合创建索引(会加重IO负担)<br>
5.where条件里用不到的字段不创建索引<br>
覆盖索引
概念<br>
判断标准
面试题<br>
说说你对 MySQL 索引的理解?<br>
mysql数据库索引的原理,为什么要用 B+树,为什么不用二叉树?<br>
聚集索引与非聚集索引的区别?<br>
InnoDB引擎中的索引策略,了解过吗?<br>
创建索引的方式有哪些?
聚簇索引/非聚簇索引,mysql索引底层实现,为什么不用B-tree,为什么不用hash,叶子结点存放的是数据还是指向数据的内存地址,使用索引需要注意的几个地方?
MySQL 索引底层实现
叶子结点存放的是数据还是指向数据的内存地址,使用索引需要注意的几个地方?<br>
使用索引查询一定能提高查询的性能吗?为什么?
那为什么mysql推荐使用整型自增主键而不是选择UUID?
为什么非主键索引结构叶子节点存储的是主键值?
mysql命令
查看InnoDB数据页大小
查看当前事务隔离级别
检查死锁
慢查询日志
查看开启状态
开启慢查询日志
数据库操作
创建数据库
查看数据库创建语句
查看所有数据库
使用某个库
数据库登录
命令行登录
sql
面试题
1.count(*) 和 count(1)和count(列名)区别<br>
2.MySQL中 in和 exists 的区别
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in
3.UNION和UNION ALL的区别?
UNION和UNION ALL都是将两个结果集合并为一个,两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);
4.sql的执行顺序
5.mysql 的内连接、左连接、右连接有什么区别?什么是内连接、外连接、交叉连接、笛卡尔积呢?<br>
事务
ACID<br>
A原子性<br>
C一致性
I隔离性<br>
D持久性
并发事务处理带来的问题和相关处理方案
问题
更新丢失(Lost Update)<br>
脏读(Dirty Reads)
不可重复读(Non-Repeatable Reads)
幻读(Phantom Reads)
幻读和不可重复读的区别:<br>
不可重复读的重点是修改
幻读的重点在于新增或者删除
处理方案
“更新丢失”
“脏读” 、 “不可重复读”和“幻读”
事务隔离级别
READ-UNCOMMITTED(读未提交)<br>
READ-COMMITTED(读已提交)
REPEATABLE-READ(可重复读)(MySQL的InnoDB引擎默认隔离级别)
SERIALIZABLE(可串行化)
MVCC机制
原理
子主题
实现方式
乐观(optimistic)并发控制<br>
悲观(pressimistic)并发控制
MySQL的InnoDB中MVCC实现方式
底层
MVCC 只在 COMMITTED READ(读提交)和REPEATABLE READ(可重复读)两种隔离级别下工作。
REPEATABLE READ(可重读)隔离级别下MVCC
事务日志
事务日志的产生原因<br>
事务日志可以帮助提高事务效率
使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。
事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。
事务日志持久以后,内存中被修改的数据在后台可以慢慢刷回到磁盘。
如果数据的修改已经记录到事务日志并持久化,但数据本身没有写回到磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这一部分修改的数据
事务的实现
MySQL 中支持事务的存储引擎有 InnoDB 和 NDB。
事务的实现就是如何实现ACID特性。<br>
事务日志分类
重做日志redo<br>
实现持久化和原子性
参考链接<br>
在innoDB的存储引擎中,事务日志通过重做(redo)日志和innoDB存储引擎的日志缓冲(InnoDB Log Buffer)实现。
redo log日志的写入方式
redolog写入到磁盘涉及三种方式
0:数据提交时提交到到日志缓存,再每秒刷新从日志缓存更新到系统缓存,然后从系统缓存中直接刷新到磁盘
1:数据提交时直接进行提交到系统缓存,并且直接从缓存中刷新到磁盘
2:数据提交到系统缓存中,然后每秒从系统缓存中直接刷新到磁盘中
redolog写入涉及到的几个位置
缓存池
日志缓存
系统缓存
磁盘
使用日志持久化而不是直接数据持久化的原因
1效率问题
2安全性问题
回滚日志undo<br>
实现一致性
undo log 主要为事务的回滚服务。记录为逻辑日志<br>
MySQL对分布式事务的支持
分布式事务的实现
MySQL 的分布式事务模型
模型中分三块
应用程序(AP)
资源管理器(RM)
事务管理器(TM)
分布式事务采用两段式提交(two-phase commit)的方式
第一阶段所有的事务节点开始准备,告诉事务管理器ready<br>
第二阶段事务管理器告诉每个节点是commit还是rollback。如果有一个节点失败,就需要全局的节点全部rollback,以此保障事务的原子性。<br>
面试题<br>
1.事务的隔离级别有哪些?MySQL的默认隔离级别是什么?<br>
2.什么是幻读,脏读,不可重复读呢?<br>
3.MySQL事务的四大特性以及实现原理
4.MVCC熟悉吗,它的底层原理?<br>
5.事务是如何通过日志来实现的,说得越深入越好。
6.你知道MySQL 有多少种日志吗?
事务日志
重做日志redo
回滚日志undo
错误日志<br>
查询日志
慢查询日志
二进制日志
中继日志
7.分布式事务相关问题,可能还会问到 2PC、3PC
锁机制
概念
锁的分类
从对数据操作的类型分类<br>
读锁(共享锁)<br>
写锁(排他锁)<br>
从对数据操作的粒度分类<br>
表级锁<br>
行级锁<br>
页面锁<br>
各个存储引擎对于锁的支持
MyISAM 表锁
两种表锁
表共享读锁 (Table Read Lock)<br>
表独占写锁 (Table Write Lock)
锁实现<br>
InnoDB锁<br>
行锁
排他锁(X)<br>
共享锁(S)<br>
意向锁
意向共享锁(IS)<br>
意向排他锁(IX)
索引失效会导致行锁变表锁
锁模式(InnoDB有三种行锁的算法)
记录锁(Record Locks)
间隙锁(Gap Locks)<br>
临键锁(Next-key Locks)
select for update锁的不同状态<br>
明确指定主键,并且有此笔资料,row lock<br>
明确指定主键,若查无此笔资料,无lock
无主键,table lock
主键不明确,table lock
加锁机制
概念<br>
乐观锁
实现方式
悲观锁
实现方式
死锁
死锁的产生<br>
死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环
当事务试图以不同的顺序锁定资源时,就可能产生死锁。多个事务同时锁定同一个资源时也可能会产生死锁
锁的行为和顺序和存储引擎相关。以同样的顺序执行语句,有些存储引擎会产生死锁有些不会——死锁有双重原因:真正的数据冲突;存储引擎的实现方式。
死锁的检测
死锁恢复
外部锁的死锁检测
死锁影响性能
不同存储引擎对死锁的处理
MyISAM避免死锁
InnoDB避免死锁:<br>
在事务中,如果要更新记录,应该直接申请足够级别的锁,即排他锁
在事务开始时通过为预期要修改的每个元祖(行)使用SELECT ... FOR UPDATE语句来获取必要的锁,即使这些行的更改语句是在之后才执行的。
如果事务需要修改或锁定多个表,则应在每个事务中以相同的顺序使用加锁语句
改变事务隔离级别
面试题
1.数据库的乐观锁和悲观锁?<br>
2.MySQL 中有哪几种锁,列举一下?
3.MySQL中InnoDB引擎的行锁是怎么实现的?
4.MySQL 间隙锁有没有了解,死锁有没有了解,写一段会造成死锁的 sql 语句,死锁发生了如何解决,MySQL 有没有提供什么机制去解决死锁<br>
5.select for update有什么含义,会锁表还是锁行还是其他
6.MySQL 遇到过死锁问题吗,你是如何解决的?
性能优化
影响mysql的性能因素<br>
业务影响
1.业务需求对MySQL的影响(合适合度)
7.其他一些访问频繁但变更较少的数据
11.不适合放进MySQL的数据<br>
12.需要放进缓存的数据
13.Schema设计对系统的性能影响
14.尽量减少对数据库访问的请求
15.尽量减少无用数据的查询请求<br>
IO影响
8.二进制多媒体数据
9.流水队列数据
10.超大文本数据
附加操作影响
4.活跃用户的基本信息数据
5.活跃用户的个性化定制信息数据
6.准实时的统计信息数据<br>
硬件影响
2.存储定位对MySQL的影响
3.系统各种配置及规则数据<br>
16.硬件环境对系统性能的影响
性能分析
MySQL Query Optimizer
执行过程
1.客户端向 MySQL 请求一条 Query<br>
2.命令解析器模块完成请求分类,区别出是 SELECT 并转发给 MySQL Query Optimizer<br>
3.MySQL Query Optimizer 首先会对整条 Query 进行优化,处理掉一些常量表达式的预算,直接换算成常量值
4.对 Query 中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等
5.然后分析 Query 中的 Hint 信息(如果有),看显示 Hint 信息是否可以完全确定该 Query 的执行计划<br>
6.如果没有 Hint 或 Hint 信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据 Query 进行写相应的计算分析,然后再得出最后的执行计划。
MySQL常见瓶颈
CPU<br>
IO
服务器硬件的性能瓶颈查看命令
性能下降SQL慢 执行时间长 等待时间长 原因分析
1.查询语句写的烂
2.索引失效(单值、复合)
3.关联查询太多join(设计缺陷或不得已的需求)
4.服务器调优及各个参数设置(缓冲、线程数等)
MySQL常见性能分析手段
1.慢查询日志
概念
查看开启状态<br>
手动开启慢查询日志
永久配置
临时配置
日志分析工具
<span style="box-sizing: border-box; font-weight: 600; color: rgb(64, 64, 64); font-family: -apple-system, BlinkMacSystemFont, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 16px;">mysqldumpslow</span><br>
得到返回记录集最多的10个SQL
得到访问次数最多的10个SQL
得到按照时间排序的前10条里面含有左连接的查询语句<br>
也可以和管道配合使用
pt-query-digest<br>
2.EXPLAIN 分析查询
作用
1.表的读取顺序<br>
2.数据读取操作的操作类型
3.哪些索引可以使用<br>
4.哪些索引被实际使用
5.表之间的引用
6.每张表有多少行被优化器查询
使用方式
显示内容的意义
id<br>
select_type
查询类型
SIMPLE
PRIMARY<br>
SUBQUERY<br>
DERIVED<br>
UNION
UNION RESULT
table
type<br>
使用索引情况
system<br>
const<br>
eq_ref<br>
ref<br>
range
index<br>
ALL<br>
possible_keys
key<br>
key_len<br>
ref<br>
rows<br>
Extra<br>
using filesort:
Using temporary
using index<br>
using where<br>
using join buffer<br>
impossible where<br>
select tables optimized away
distinct<br>
分析示例
示例图
示例分析
第一行(执行顺序4)
第二行(执行顺序2)<br>
第三行(执行顺序3)
第四行(执行顺序1)
第五行(执行顺序5)
3.profiling分析
作用
show profiles;
字段结果意义
查看是否开启
开启功能
4.show命令查询系统状态及系统变量
show status ——显示状态信息(扩展show status like ‘XXX’)
show variables ——显示系统变量(扩展show variables like ‘XXX’)
show innodb status ——显示InnoDB存储引擎的状态
show processlist ——查看当前SQL执行,包括执行状态、是否锁表等
mysqladmin variables -u username -p password——显示系统变量
mysqladmin extended-status -u username -p password——显示状态信息
性能优化
索引优化<br>
1.全值匹配<br>
2.最佳左前缀法则,比如建立了一个联合索引(a,b,c),那么其实我们可利用的索引就有(a), (a,b), (a,b,c)<br>
3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
4.存储引擎不能使用索引中范围条件右边的列
5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select
6.is null ,is not null 也无法使用索引
7.like "xxxx%" 是可以用到索引的,like "%xxxx" 则不行(like "%xxx%" 同理)。like以通配符开头('%abc...')索引失效会变成全表扫描的操作,
8.字符串不加单引号索引失效
9.少用or,用它来连接时会索引失效
10.<,<=,=,>,>=,BETWEEN,IN 可用到索引,<>,not in ,!= 则不行,会导致全表扫描<br>
索引使用建议
对于单键索引,尽量选择针对当前query过滤性更好的索引
在选择组合索引的时候,当前Query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。<br>
在选择组合索引的时候,尽量选择可以能够包含当前query中的where字句中更多字段的索引<br>
尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的
少用Hint强制索引<br>
查询优化<br>
1.永远小标驱动大表(小的数据集驱动大的数据集)
2.order by关键字优化<br>
1.order by子句,尽量使用 Index 方式排序,避免使用 FileSort 方式排序
2.MySQL 支持两种方式的排序,FileSort 和 Index,Index效率高,它指 MySQL 扫描索引本身完成排序,FileSort 效率较低;
3.ORDER BY 满足两种情况,会使用Index方式排序
ORDER BY语句使用索引最左前列
使用where子句与ORDER BY子句条件列组合满足索引最左前列
4.尽可能在索引列上完成排序操作,遵照索引建的最佳最前缀
5.如果不在索引列上,filesort 有两种算法,mysql就要启动双路排序和单路排序
双路排序:MySQL 4.1之前是使用双路排序,字面意思就是两次扫描磁盘,最终得到数据
单路排序:从磁盘读取查询需要的所有列,按照order by 列在 buffer对它们进行排序,然后扫描排序后的列表进行输出,效率高于双路排序
6.优化策略
增大sort_buffer_size参数的设置
增大max_lencth_for_sort_data参数的设置
3.GROUP BY关键字优化
1.group by实质是先排序后进行分组,遵照索引建的最佳左前缀
2.当无法使用索引列,增大 max_length_for_sort_data 参数的设置,增大sort_buffer_size参数的设置
3.where高于having,能写在where限定的条件就不要去having限定了
3.数据类型优化
1.更小的通常更好:一般情况下,应该尽量使用可以正确存储数据的最小数据类型
2.简单就好:简单的数据类型通常需要更少的CPU周期
3.尽量避免NULL:通常情况下最好指定列为NOT NULL
面试题
1.日常工作中你是怎么优化SQL的?
2.SQL优化的一般步骤是什么,怎么看执行计划(explain),如何理解其中各个字段的含义?
3.如何写sql能够有效的使用到复合索引?
4.一条sql执行过长的时间,你如何优化,从哪些方面入手?
5.什么是最左前缀原则?什么是最左匹配原则?<br>
6.查询中哪些情况不会使用索引?
分区分表分库
MySQL分区
概念
作用
1.逻辑数据分割<br>
2.提高单一的写和读应用速度
3.提高分区范围读查询的速度
4.分割数据能够有多个不同的物理文件路径
5.高效的保存历史数据
相关操作
查看是否支持表分区
分区类型及操作
RANGE分区
好处
LIST分区<br>
HASH分区
优劣
KEY分区<br>
分区存在的问题
1.分区表,分区键设计不太灵活,如果不走分区键,很容易出现全表锁
2.一旦数据并发量上来,如果在分区表实施关联,就是一个灾难
3.内部不可控
MySQL分表
分表方式<br>
垂直拆分
水平拆分(数据分片)<br>
水平拆分的方法
使用MD5哈希<br>
根据时间放入不同的表<br>
按热度拆分<br>
根据ID的值放入对应的表<br>
MySQL分库
分库的原因<br>
概念
分库的优点
1.减少增量数据写入时的锁对查询的影响<br>
2.由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询所需的检索行数变少,减少了磁盘IO,时延变短
分库分表后问题
分布式事务的问题
数据操作维度问题
跨库联合查询的问题<br>
面试题
1.随着业务的发展,业务越来越复杂,应用的模块越来越多,总的数据量很大,高并发读写操作均超过单个数据库服务器的处理能力怎么办?
2.说说分库与分表的设计
3.为什么要分库?
4.什么是分库
主从复制
原理<br>
二进制日志(binlog)<br>
录入方式
statement模式<br>
row级别
mixed
主从复制的过程
1.master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events<br>
2.salve 将 master 的 binary log events 拷贝到它的中继日志(relay log);<br>
3.slave 重做中继日志中的事件,将改变应用到自己的数据库中。MySQL 复制是异步且是串行化的。
示意图
主从复制的原则
1.每个 slave只有一个 master
2.每个 salve只能有一个唯一的服务器 ID
3.每个master可以有多个salve
主要问题
其他
三大范式
第一范式<br>
第二范式
第三范式
参考地址
官网
教程
问题处理
配置
MYSQL17-SQL优化-慢查询日志
自由主题
0 条评论
下一页