mysql增加分区表
概述简单分享下最近做的一个mysql数据库分区表改造方案,仅供参考。思路:(假设在2020.7.21进行表分区改造)没时间,就不画图说明了1、创建与原始表一样结构的新表,新分区2、往新表插入旧表在20...
2024.11.15版权声明:本文为CSDN博主「java叶新东老师」的原创文章
原文链接:https://blog.csdn.net/qq_27184497/article/details/119274535
前言在执行一条sql的时候,在mysql内部都会通过以下四个流程
+--------------+|连接器|+--------------+ \|/+--------------+|分析器|+--------------+ \|/+--------------+|优化器| +--------------+ \|/+--------------+|执行器| +--------------+我们都知道索引其中一个最主要作用就是加快数据的访问,那么回表、索引覆盖、最左匹配、索引下推 都是mysql的内部优化方式,部分的功能是Mysql5.6的版本上推出的,都是针对索引的优化,如果表中没有索引的情况下,那么就不会有这些优化;
回表首先我们要知道,每建一个索引在数据库底层都会新建一个B+树,也就是说,一个索引对应一个B+树,回表就是你在查询二级索引字段的时候,二级索引的这棵树中存储的是一级索引的键值,通过这个键值再去一级索引的B+树种查询数据,这种查询叫做回表;需要注意的是,只有普通索引才会有回表的情况,如果你不是普通索引的话,是不存在回表的比如我们有一张user表,将id设为主键,将name字段设为普通索引,sql如下
create table ( id bigint(20) NOT NULL AUTO_INCREMENT parmary key, name varchar(20) comment ‘姓名‘, age int(3) comment ‘年龄‘);sql语句演示
select * from user where name = ‘dong‘当数据库在查询上面这条sql时,先去name索引的B+树里面去找对应的字符串dong,叶子节点存储的是对应行的主键id,拿到主键id后再去id索引的B+树找那一行数据,name索引B+树和id主键B+树如下图
覆盖索引覆盖索引,我们知道索引节点本身其实也是数据,如果我们只需要索引节点数据(只需要索引字段,不需要其他非索引字段),那查询时就可以直接返回索引节点数据,而不需要再回表。
还是这个sql
select id from user where name = ‘dong‘因为我们查询列是主键id,name索引的B+树种已经有id的数据了,那我就不需要费那么大劲再去查主键的B+树了
最左匹配需要明确一点的是,只有组合索引才会有最左匹配,组合所以的B+树如下图
例如我建了个组合索引(a,b,c)。因为A在最左边,如果我只查询where a = ?,那么这种情况也会走索引查询, 这就叫最左匹配
最左匹配还有其他的一些规则,比如当我使用下列sql时索引都会生效
-- where子句几个搜索条件顺序调换不影响查询结果,因为Mysql中有查询优化器,会自动优化查询顺序select * from table_name where a = ‘1‘ and b = ‘2‘ and c = ‘3‘ select * from table_name where b = ‘2‘ and a = ‘1‘ and c = ‘3‘ select * from table_name where c = ‘3‘ and b = ‘2‘ and a = ‘1‘ --都从最左边开始连续匹配,所以下列sql也用到了索引select * from table_name where a = ‘1‘ select * from table_name where a = ‘1‘ and b = ‘2‘select * from table_name where a = ‘1‘ and b = ‘2‘ and c = ‘3‘--如果不连续时,只用到了a列的索引,b列和c列都没有用到 select * from table_name where a = ‘1‘ and c = ‘3‘ select * from table_name where a like ‘As%‘; --前缀都是排好序的,走索引查询select * from table_name wherea > 1 and a < 3-- 可以对最左边的列进行范围查询-- 排序时,只要遵循最左匹配原则都会走索引select * from table_name order by a limit 10;select * from table_name order by a,b limit 10;下列的sql查询时走的是全表查询(未使用索引)
-- 这些没有从最左边开始,最后查询没有用到索引,用的是全表扫描 select * from table_name whereb = ‘2‘ select * from table_name wherec = ‘3‘select * from table_name whereb = ‘1‘ and c = ‘3‘ select * from table_name wherea like ‘%As‘//前缀模糊了,走全表查询select * from table_name wherea like ‘%As%‘//走全表查询-- 多个列同时进行范围查找时,只有对索引最左边的那个列进行范围查找才用到B+树索引,也就是只有a用到索引,在1概述简单分享下最近做的一个mysql数据库分区表改造方案,仅供参考。思路:(假设在2020.7.21进行表分区改造)没时间,就不画图说明了1、创建与原始表一样结构的新表,新分区2、往新表插入旧表在20...
2024.11.15邮件发送原理telnet命令模拟邮件发送:1、cmd命令下telnet连接上QQ的smtp服务器telnet smtp.163.com 25遇到问题以及解决办法:telnet命令错误控制面板下wind...
2024.11.15今天有个同事问我一个数据库的问题,如果开始他就把环境细节全都告诉我,可能我就知难而退了。等我大体明白了问题之后,发现好像背景比我想的要复杂多了。这是一个远程云主机环境,windows系统,运行着MyS...
2024.11.15概述今天介绍下mysql视图方面的内容,通俗的讲,视图就是一条select语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。01特性视图是对若干张基本表的引用...
2024.11.151、登陆成功后,首先进入某一个数据库 (不是指数据库服务器)use t1; //t1是数据库名如图所示:2、在此数据库中建立数据库表1)、 先建立表结构(可以理解为表的列名,也就是字段名)在实际生产过...
2024.11.12