热搜:前端 nest neovim nvim

MySQL批量插入测试报告这几种方法

lxf2023-05-14 00:51:01

我正参与「程序编写·启航计划」

联合索引

对外键约束创建的检索称为聚簇索引, 对于大部分字段名创建的检索称为二级索引

好几个一般字段名组合在一起建立的检索称为联合索引, 又被称作组合索引

在建立联合索引时, 须要主要留意好几个字段名顺序难题, 由于(a,b,c)和(b,a,c)在使用过程中会有所不同

联合索引的应用必须遵照最左前缀匹配原则, 也都是按照最左优先选择的形式进行检索的配对

联合索引实行实例

创建一个(a,b,c)的联合索引, 下一步将会举例说明可能遇到中的所有状况, 并写下会不会实行检索

Where语句检索有没有被应用
where a = 1Y,用到a
where a = 1 and b = 2Y,用到a,b
where a = 1 and b = 2 and c = 3Y,用到a,b,c
where a = 1 and b like 'kk%' and c = 3Y,用到a,b,c
where a = 1 and b like '%kk' and c = 3Y,仅用到a
where a = 1 and b like '%kk%' and c = 3Y,仅用到a
where a = 1 and b like 'k%kk%' and c = 3Y,用到a,b,c
where a = 1 and c = 3用到a, 可是c不能,b中间歇了
where a =13 and b > 2 and c = 3用到a和b, c不可以用于范畴以后,b断掉
where a is null and b is not nullis null 适用检索 可是is not null 不兼容,因此 a 可以用检索,可是 b不一定能用到检索(8.0)
where b = 2 或是 where b = 3 and c = 4 或是 where c = 4N
where a <> 1无法使用检索
where abs(a) =1无法使用 检索
where b = 2无法使用 检索
where c = 3无法使用 检索
where b = 2 and c = 3无法使用 检索

由于有查询优化器, 因此字段名 a在 where子句里的次序并不重要

检索的 order by提升

MySQL里的排序方式

在 MySQL含有二种排序方式:

  • Using filesort: 根据表中检索或全表扫描, 载入符合要求的数据信息行, 之后在排列缓冲区域sort buffer中进行排列实际操作, 全部并不是根据检索立即回到排列过程的排列都喊Using filesort
  • Using index: 根据井然有序检索次序扫描仪立即回到井然有序数据信息, 这样的情况下采用的是Using index, 不需要大量的的排列, 实际操作工作效率高

非常明显, Using index 应用到检索, 一定是特性强的, 因此我们在具体使用时尽量把 SQL提升到Using index

下面我们就测试一下 order by的检索应用

数据准备

测试报告嘛, 一定是愈多愈好. 这儿提议收看我本文 MySQL批量插入测试报告这几种方法 - 程序编写 ()

安排了一张表, 信息量 2w

角色表:

  • id: 自增长
  • role_name: 随机字符串, 不可以反复
  • orders: 1-1000随意数据

MySQL批量插入测试报告这几种方法

无检索

这儿我们应该用到explain指令, 是大家很了解的啦

explain指令主要运用于查询 SQL的制定计划, 该指令能够仿真模拟优化器实行 SQL查询语句

现阶段我们自己的role表有并没有检索的

MySQL批量插入测试报告这几种方法

下面我们会实行下列 SQL句子各自查询并没有检索与有检索的现象

explain select * from role order by orders

MySQL批量插入测试报告这几种方法

这时能够看见, 由于排列需要用到的标准orders并没有使用检索, 检索要用到排列缓冲区域, 就是把数据信息读出, 之后在排列缓冲区域进行筛选后呈现出来

有检索

这时候我们给role表新增加检索

-- 给tb_user里的age和phone创建索引 
-- CREATE INDEZ 检索名 ON 表名(字段...);
CREATE INDEX or_role ON role(orders,role_name);

MySQL批量插入测试报告这几种方法

如今我们就建立好所需要的检索了, 重新执行一下以前的 SQL句子

explain select * from role order by orders, role_name

MySQL批量插入测试报告这几种方法

此次大家可以看到Extra出现Using index, 也意味着使用到检索, 与此同时需注意, 今天我们应用到2个排列字段名ordersrole_name, 也就是大家以前建立的检索, 大家都知道, MySQL有着自己的实行优化器, where子句索引字段所在的位置无关痛痒, 只需应用到就能, 那样order by是否都是这样呢

where子句索引字段次序不一致

explain select * from role where orders = 500 and role_name like 'a%'

MySQL批量插入测试报告这几种方法

咱便说, 不清楚没事儿, 不看后悔

order by索引字段次序不一致

explain select * from role order by role_name,orders

下面我们看一下 order by子句字段名次序与检索次序不一致的状况

MySQL批量插入测试报告这几种方法

能够看见, 到最后还是出现Using filesort的现象

索引字段调节序不一致

explain select * from role order by orders asc, role_name desc

MySQL批量插入测试报告这几种方法

在使用 order by时如果并没有特定次序, 默认设置都是根据升序排列的, 检索都是这样, 字段名默认设置是升序排列的, 可是在我们查看时一个降序, 一个升序, 这时就容易出现Using filesort

如果要解决这些问题, 我们可以用下边的 SQL句子在形成检索时特定检索的排序

CREATE INDEX or_role ON role(orders asc,role_name desc);

汇总

在我们应用联合索引时, 在where子句中要了解最左前缀检索是不是应用到, 有效去创建索引, 由于 MySQL有优化器的出现, 因此在where子句中不需要担心字段名顺序难题

但在order by应用联合索引时, 要了解order by字段和检索次序是否一致, 排序规则和检索是否一致

文中具体内容告一段落了
若有获得热烈欢迎关注点赞