TiDB实战篇-基于索引的SQL优化

news2024/12/23 7:48:35

简介

TiDB实战篇-基于索引的SQL优化。

Online DDL

允许直接在线执行ddl操作,不会锁表,但是执行多个ddl的时候会要排队。

原理

 

控制创建索引的速度

 

查看影响

标红的是加了多少行索引。 

添加索引的线上的影响(读写频繁)

 

 

只读场景

 

不涉及读写

 

索引扫描的方式

 

直接从索性计算

 

索引选择的规则

 

实操

优化创建索引的是时间


mysql -h192.168.66.10 -P4000 -uroot -ptidb
#创建数据库
create database test2;
create table t1(a int,b int);
#导入数据
for i in `seq 10000`; do mysql -uroot -P4000 -ptidb -h192.168.66.10 -e "insert into test2.t1 values($i,floor(rand()*10000000))";done;
for i in `seq 33`; do mysql -uroot -P4000 -ptidb -h192.168.66.10 -e "insert into test2.t1 select * from test2.t1 limit 100000";done;
#调节创建索引速度的参数
set global tidb_ddl_reorg_worker_cnt=1;
set global tidb_ddl_reorg_batch_size=32;

#创建索引
mysql -h192.168.66.10 -P4000 -uroot -ptidb
use test2;
create index index_t1_a on t1(a);
#查看索引创建的速度
admin show ddl jobs where table_name = 't1';

mysql>admin show ddl jobs where table_name = 't1';
+--------+---------+------------+--------------+----------------------+-----------+----------+-----------+---------------------+---------------------+---------------------+---------+
| JOB_ID | DB_NAME | TABLE_NAME | JOB_TYPE     | SCHEMA_STATE         | SCHEMA_ID | TABLE_ID | ROW_COUNT | CREATE_TIME         | START_TIME          | END_TIME            | STATE   |
+--------+---------+------------+--------------+----------------------+-----------+----------+-----------+---------------------+---------------------+---------------------+---------+
|     86 | test2   | t1         | add index    | write reorganization |        82 |       84 |    479488 | 2023-04-30 14:44:51 | 2023-04-30 14:44:51 | NULL                | running |
|     85 | test2   | t1         | create table | public               |        82 |       84 |         0 | 2023-04-30 14:39:45 | 2023-04-30 14:39:45 | 2023-04-30 14:39:45 | synced  |
|     80 | test2   | t1         | create table | public               |        77 |       79 |         0 | 2023-04-30 12:59:23 | 2023-04-30 12:59:23 | 2023-04-30 12:59:23 | synced  |
+--------+---------+------------+--------------+----------------------+-----------+----------+-----------+---------------------+---------------------+---------------------+---------+
3 rows in set (0.01 sec)

Query OK, 0 rows affected (3 min 20.92 sec)

#调节创建索引速度的参数
set global tidb_ddl_reorg_worker_cnt=32;
set global tidb_ddl_reorg_batch_size=512;
#删除掉之前的索引
alter table t1 drop index index_t1_a;
#重新创建索引
create index index_t1_a on t1(a);

用时Query OK, 0 rows affected (2 min 44.09 sec)

Point_Get 

#point get触发
mysql -h192.168.66.10 -P4000 -uroot -ptidb
create database test3;
use test3;
create table t1(a int,b int);
#导入实验数据
for i in `seq 10000`; do mysql -uroot -P4000 -ptidb -h192.168.66.10 -e "insert into test3.t1 values($i,floor(rand()*10000000))";done;
for i in `seq 33`; do mysql -uroot -P4000 -ptidb -h192.168.66.10 -e "insert into test3.t1 select * from test2.t1 limit 100000";done;
#查看导入数据和执行计划
select count(*) from t1;
explain select * from t1 where a=888;

mysql> explain select * from t1 where a=888;
+-------------------------+---------+-----------+---------------+--------------------------------+
| id                      | estRows | task      | access object | operator info                  |
+-------------------------+---------+-----------+---------------+--------------------------------+
| TableReader_7           | 3.91    | root      |               | data:Selection_6               |
| └─Selection_6           | 3.91    | cop[tikv] |               | eq(test3.t1.a, 888)            |
|   └─TableFullScan_5     | 3906.00 | cop[tikv] | table:t1      | keep order:false, stats:pseudo |
+-------------------------+---------+-----------+---------------+--------------------------------+
3 rows in set (0.00 sec)

#添加索引(非唯一索引)
create index idx on t1(a);
explain select * from t1 where a=888;

mysql> explain select * from t1 where a=888;
+-------------------------------+---------+-----------+------------------------+-----------------------------------+
| id                            | estRows | task      | access object          | operator info                     |
+-------------------------------+---------+-----------+------------------------+-----------------------------------+
| IndexLookUp_10                | 1.00    | root      |                        |                                   |
| ├─IndexRangeScan_8(Build)     | 1.00    | cop[tikv] | table:t1, index:idx(a) | range:[888,888], keep order:false |
| └─TableRowIDScan_9(Probe)     | 1.00    | cop[tikv] | table:t1               | keep order:false                  |
+-------------------------------+---------+-----------+------------------------+-----------------------------------+
3 rows in set (0.00 sec)

#添加唯一索引
alter table t1 drop index idx;
create unique index idx on t1(a);
explain select * from t1 where a=888;

mysql> explain select * from t1 where a=888;
+-------------+---------+------+------------------------+---------------+
| id          | estRows | task | access object          | operator info |
+-------------+---------+------+------------------------+---------------+
| Point_Get_1 | 1.00    | root | table:t1, index:idx(a) |               |
+-------------+---------+------+------------------------+---------------+
1 row in set (0.00 sec)

#测试非等值查询
explain select * from t1 where a>888;

mysql> explain select * from t1 where a>888;
+-------------------------+----------+-----------+---------------+---------------------+
| id                      | estRows  | task      | access object | operator info       |
+-------------------------+----------+-----------+---------------+---------------------+
| TableReader_7           | 9112.00  | root      |               | data:Selection_6    |
| └─Selection_6           | 9112.00  | cop[tikv] |               | gt(test3.t1.a, 888) |
|   └─TableFullScan_5     | 10000.00 | cop[tikv] | table:t1      | keep order:false    |
+-------------------------+----------+-----------+---------------+---------------------+
3 rows in set (0.01 sec)

#测试空值是否会触发
insert into t1 values(null,10000);

explain select * from t1 where a is null;

mysql> explain select * from t1 where a is null;
+-------------------------------+---------+-----------+------------------------+-------------------------------------+
| id                            | estRows | task      | access object          | operator info                       |
+-------------------------------+---------+-----------+------------------------+-------------------------------------+
| IndexLookUp_10                | 1.00    | root      |                        |                                     |
| ├─IndexRangeScan_8(Build)     | 1.00    | cop[tikv] | table:t1, index:idx(a) | range:[NULL,NULL], keep order:false |
| └─TableRowIDScan_9(Probe)     | 1.00    | cop[tikv] | table:t1               | keep order:false                    |
+-------------------------------+---------+-----------+------------------------+-------------------------------------+
3 rows in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux程序设计之IP地址转换

1.通常,人们习惯于使用可读性好的字符串来表示IP的地址,但是,在实际的使用过程中,需要使用的IP地址应该为无符号的整数(在计算机中存储时是对应的二进制,只有二进制计算机才能识别,即0、1)。已经封装好的函…

windows开机不自动挂载磁盘的方法

本人的电脑系统为win11 写作时间20230430 开机不挂载某块磁盘的理由 1.本人电脑上有个仓库盘是机械硬盘,并不是每次开机都要用到,开机不挂载也许有利于增加数据盘的寿命 2.挂载了数据盘,有时候打开文件页面会比较慢,不够丝滑 …

MATLAB绘制汽车理论的仿真图片

这里写自定义目录标题 仿真绘图内容发动机最优曲线最优燃油消耗率曲线最优效率曲线工作时间/能量消耗的分布 传统车动力性分析绘制三(或多个)y坐标轴函数统计数据分布情况函数 仿真绘图内容 从传统车到新能源混合动力车型的不同绘制。 发动机最优曲线 …

排序算法 - 选择排序

文章目录 选择排序介绍选择排序实现选择排序的时间复杂度和稳定性选择排序时间复杂度选择排序稳定性 代码实现核心&总结 每日一道算法,提高脑力。第四天,选择排序。 选择排序介绍 它的基本思想是: 首先在未排序的数列中找到最小(or最大)元素&#…

Vue3超详细的ref()用法,看这一篇就够了

ref()接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。 ref() 将传入参数的值包装为一个带 .value 属性的 ref 对象。 1、ref 对象是可更改的,即可以为 .value 赋予新的值 举例: c…

使用Vscode调试shell脚本 环境搭建基本步骤

操作系统: Linux --CentOS. step1: 在Vscode 中安装Bash Debug Step2:创建一个名字为123.sh的shell脚本; 输入123.sh, 回车: ​​​​​​Step3:编辑简单的待打印的内容,如下: Step4: 配置编译器 修改为下面内容: Step5: 点击按…

spring源码搭建记录

spring源码搭建记录 一.环境1.1 构建工具1.1.1 Gradle简介1.1.2 与常见的项目构建工具对比1.1.3 gradle下载1.1.4 Gradle安装 1.2 jdk与源码版本1.3 源码下载与导入 一.环境 1.1 构建工具 Spring源码工程使用的项目构建工具不是Maven,而是Google的Gradle。首先需了…

Docker搭建配置Gitlab

Docker搭建配置Gitlab 1 参考文档2 Gitlab相关介绍2.1 Gitlab2.2 Git和SVN的区别2.3 Git、Gitlab、GitHub的简单区别 3 搭建Gitlab仓库3.1 拉取镜像3.2 启动容器3.3 修改配置文件 4 管理员登录Gitlab5 Gitlab配置邮箱6 创建组7 创建项目8 创建用户9 Gitlab 数据备份【这块待实践…

第29步 机器学习分类实战:支持向量机(SVM)建模

文章目录 前言一、数据预处理二、SVM的调参策略三、SVM调参演示总结 前言 支持向量机(SVM)建模。 一、数据预处理 import numpy as np import matplotlib.pyplot as plt import pandas as pd dataset pd.read_csv(X disease code fs.csv) X dataset.…

SSM整合(二) | 表现层数据封装格式及封装步骤

文章目录 表现层数据封装数据返回格式数据封装 表现层数据封装 数据返回格式 表现层数据封装是什么意思呢? 我们根据目前做的增删改查功能来看看目前返回数据的格式存在哪些问题 增删改的数据返回格式如下: true查询单条数据的返回格式如下: {"id": 1,"type&…

【致敬未来的攻城狮计划】— 连续打卡第十七天:FSP固件库开发GPT — PWM通用定时器 定时2s LED 闪烁

系列文章目录 1.连续打卡第一天:提前对CPK_RA2E1是瑞萨RA系列开发板的初体验,了解一下 2.开发环境的选择和调试(从零开始,加油) 3.欲速则不达,今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

MySQL提权/条件竞争漏洞分析和利用(37)

预备知识 漏洞描述 CVE编号&#xff1a;CVE-2016-6663 / CVE-2016-5616 && CVE-2016-6664-5617漏洞级别&#xff1a;严重 漏洞影响&#xff1a;漏洞影响&#xff1a; MariaDB < 5.5.52 < 10.1.18 < 10.0.28 MySQL < 5.5.51 < 5.6.32 < 5.7…

【MATLAB数据处理实用案例详解(18)】——利用自组织特征映射网络实现亚洲足球水平聚类

目录 一、问题描述二、自组织特征映射网络实现亚洲足球水平聚类原理三、算法步骤3.1 定义样本3.2 创建网络3.3 网络训练3.4 测试3.5 显示聚类结果 四、运行结果五、完整代码 一、问题描述 中国男子足球队的比赛成绩一直牵动着广大球迷的心。很多人认定中国队已处于亚洲三流甚至…

SpringBoot 多数据源及事务解决方案

1. 背景 一个主库和N个应用库的数据源&#xff0c;并且会同时操作主库和应用库的数据&#xff0c;需要解决以下两个问题&#xff1a; 如何动态管理多个数据源以及切换&#xff1f; 如何保证多数据源场景下的数据一致性(事务)&#xff1f; 本文主要探讨这两个问题的解决方案…

【C++】——C++基础知识点(C++和C语言的区别)

文章目录 1. 前言2. 命名空间2.1 命名空间定义2.2 命名空间使用 3. C的输入输出4. 缺省参数4.1 缺省参数概念4.2 缺省参数分类 5. 函数重载5.1 函数重载概念5.2 C支持函数重载的原理——名字修饰 6. 引用6.1 引用概念6.2 引用特性6.3 常引用6.4 引用的使用场景6.5 引用和指针的…

OtterCTF

五年前的老题了&#xff0c;但还是值得一做&#xff0c;内存取证yyds! What the password? 取电脑的密码 先看缓存在内存中的注册表的偏移量 volatility_2.6_win64_standalone -f 1.vmem --profileWin7SP1x64 hivelist关注到SAM(账户密码表)和system volatility_2.6_win6…

MRI k空间概念整理

以下内容为MRI期末复习笔记&#xff0c;仅供复习参考使用。 K空间概念 K空间为包含MR数据的阵列&#xff0c;也可定义为原始数据阵列相位编码轴和频率编码轴的交叉点 MR扫描得到的数据为谱空间数据&#xff0c;谱空间数据与空间数据位置无直接对应关系 k空间每一数据点或数据…

数组、链表专题

数组、链表专题 前缀和数组LeetCode 303. 区域和检索 - 数组不可变解题思路代码实现 LeetCode 304. 二维区域和检索 - 矩阵不可变解题思路代码实现 总结 不要纠结&#xff0c;干就完事了&#xff0c;熟练度很重要&#xff01;&#xff01;&#xff01;多练习&#xff0c;多总结…

4726.ACWing.第80场周赛寻找数字

ACWing.第80场周赛寻找数字 题目算法思想代码 题目 算法思想 时间复杂度 相当于01背包的搜索时间复杂度&#xff0c;每个位上要么是 4 要么是 7 &#xff0c;而且题意位数不超过10位&#xff0c;所以dfs可以直接过搜索算法 代码 #include<bits/stdc.h> using namespac…

【LeetCode】235. 二叉搜索树的最近公共祖先

1. 问题 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可…