基于索引的SQL调优

索引 —— OceanBase SQL 性能实践分享(1) 当发现某一条 SQL 存在性能问题时,我们可以通过很多方式对这条 SQL 进行化,其中最常见的是索引。本文介绍 OceanBase 中索引的一些基础知识,以及创建合适的索引的方法。 阅读详情

基于索引的SQL调优

关系型数据库MySQL是有一套明确的规则去执行各类SQL语句的。基于这套规则,开发人员可以在数据库层面上,提高SQL的执行效率。

官方的优化文档给了很详细的优化建议,本文结合自身理解,摘一些可执行性高,且比较好分类的进行介绍。开始前,我们需要先讲一下索引的类型。

 

重要的索引类型

主键(Clusterd Index)
在这里插入图片描述
主键索引会附带该行所有的数据信息,“打包”成一个数据页挂载在B+树的叶子节点

 

二级索引
在这里插入图片描述

二级索引只会挂载对应的主键ID

 

联合索引
在这里插入图片描述

联合索引是把多个列整合,并以第一个位置上的列为B+树的节点做排序和平衡性;在节点数据的最后,同样挂载对应的主键ID

 

Hash索引

Hash索引是MySQL针对热点数据,自动创建的索引类型。针对Hash碰撞问题,MySQL会根据长度在节点后加链表或红黑树

 

如何设置索引?

  • 从表格数据推算离散性
SELECT COUNT(DISTINCT name) / COUNT(*) FROM table1

把所有列都计算一遍离散值,越接近1则越适合做索引

  • 占用空间小,前缀索引

优先选择字节数小的数据类型;对于TEXT,BLOB这类长字段则需要使用前缀作为索引

SELECT COUNT(DISTINCT LEFT(article, 10)) / COUNT(*) FROM table1

计算不同长度前缀的离散值

  • 三星索引评价标准:
SELECT song FROM albums WHERE musician = 'Maroon5' AND album_name='Songs About Jane' ORDER BY song
  1. 一个SQL语句,在经过索引的过滤后,剩下的索引宽度越窄越好——剩下的数据量越小越好;

  2. 由于B+树本身会对索引排序,因此在用ORDER BY命令时能直接利用索引的排序是更好的;

  3. 如果SQL语句中需要的所有列都可以被一个索引包涵,是更好的

在这里插入图片描述

 

如何使用索引?

以下面这个表为例,重点介绍几个优化点

CREATE TABLE `order_exp` (
  `id` bigint(22) NOT NULL AUTO_INCREMENT,
  `order_no` varchar(50) NOT NULL,
  `order_note` varchar(100) NOT NULL,
  `insert_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `expire_duration` bigint(22) NOT NULL,
  `expire_time` datetime NOT NULL,
  `order_status` smallint(6) NOT NULL DEFAULT '0',

  PRIMARY KEY (`id`)
  UNIQUE KEY `u_idx_day_status` (`insert_time`,`order_status`,`expire_time`),
  KEY `idx_order_no` (`order_no`),
  KEY `idx_expire_time` (`expire_time`)
)

 

不要在索引上进行操作

避免 加减;函数;类型转换;使用null值

EXPLAIN SELECT * FROM order_exp WHERE id + 1 = 17;
typekeykey_lenExtra
ALLNULLNULLUsing where

可以看到,在主键用了+1操作后,执行计划中的key就变为NULL,进而导致查询效率变低。

 

最大化利用索引
  • 左前缀匹配;全字匹配;范围要放在最后;
EXPLAIN Select * from s1 where order_status=1 and expire_time='2021-03-22 18:35:14';
typekeykey_lenExtra
ALLNULLNULLUsing where

对于索引UNIQUE KEY u_idx_day_status (insert_time,order_status,expire_time)

联合索引是以最左侧的列建立索引的,所以要使用该索引,必须要有insert_time这一列

MySQL是按照声明的顺序安排列的前后关系,因此为了更大化利用索引——让key_len足够长,需要把范围条件尽量推到后面顺序的列上

EXPLAIN select * from order_exp where insert_time>'2021-03-22 18:23:42' and insert_time<'2021-03-22 18:35:00';
typekeykey_lenExtra
rangeu_idx_day_status6Using index condition
EXPLAIN select * from order_exp
where insert_time='2021-03-22 18:34:55' and order_status=0 and expire_time>'2021-03-22
18:23:57' and expire_time<'2021-03-22 18:35:00' ;
typekeykey_lenExtra
rangeu_idx_day_status13Using index condition

第二个查询语句的key_len明显更长一些。

 

  • like使用前缀;
explain SELECT * FROM order_exp WHERE order_no like '%_6S';
typekeykey_lenExtra
ALLNULLNULLUsing where

MySQL是只支持前缀做索引的,如果想要用后缀,最好自己根据后缀新建一个索引列。

 

  • OR尽量为同一个字段;排序时按固定顺序,且排序字段同属于一个索引;
explain SELECT * FROM order_exp WHERE expire_time= '2021-03-22 18:35:09' OR order_note = 'abc';
typekeykey_lenExtra
ALLNULLNULLUsing where

MySQL在优化查询时,一个语句只会用一个索引,因此对于OR,可以用两个语句分别查询,再拼接结果。

 

业务优化查询

按照主键顺序插入;count查询可通过redis完成;limit分页

有的功能需要用到分页功能,比如从满足条件的第100行开始,取10条数据返回

select * from order_exp limit 100,10;
typekeykey_lenExtra
ALLNULLNULL

这样的语句会直接扫描前100行数据,然后才能返回后10条。为了提高查询效率,我们可以直接在后端开发上做改进,进而优化SQL。

比如直接指定ID

select * from order_exp where id > 120 order by id limit 10;

 

结语

其实相比于SQL的优化来说,服务端架构的优化难度更小,且效果更好。因此在设计一个功能时,先考虑清楚架构问题;再根据需要对SQL进行调优。

 

https://dev.mysql.com/doc/refman/8.0/en/optimization.html

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

https://book.douban.com/subject/26419771/

GaussDB SQL:建立合适的索引 所有手段都是围绕资源使用开展的。比如做典型点查询的时候,可以用seqscan+filter(即读取每一条元组和点查询条件进行匹配)实现,也可以通过indexscan实现,显然indexscan可以以更小的代价实现相同的效果。拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能越的企业级数据库服务。很明显,执行计划中存在SubPlan,并且SubPlan中的运算相当重,即此SubPlan是一个明确的性能瓶颈点。 阅读详情

相关推荐

Python实战:5分钟搞定固定翼无人机三自由度仿真(附完整代码)

本文提供了一个基于Python的固定翼无人机三自由度仿真快速实现方案。通过面向对象设计,封装了核心运动学模型,并对比了欧拉法与龙格-库塔法两种积分方法。文章附有完整实例代码,帮助算法工程师和研究人员在5分钟内搭建轻量级仿真环境,用于快速验证控制律、路径规划等核心算法逻辑。

docker7nomad的博客 713

索引sql

(2)主键顺序插入:因为innodb类型的表是按照主键的顺序存储的,所以导入的数据按照主键的顺序排列,可以有效的提高导入数据的效率,如果innoDB表没有主键,那么系统会自动默认创建一个内部列作为主键,所以如果可以给表创建一个主键,将可以利用主键顺序插入以提高导入数据的效率;尽量减少额外排序,通过索引直接返回数据,where条件和order by 使用相同的索引,并且order by的顺序和索引的顺序相同,且order by的字段要么都是升序,要么都是降序。如果没有索引,则应该考虑增加索引;...

m0_71467744的博客 1754

基于YOLOv11的人脸识别系统:从构建到应用的全流程指南

深度学习是机器学习的一个分支,旨在通过多层神经网络模拟人脑的认知能力。它能够从大量数据中自动提取特征,并进行准确的预测和分类。在计算机视觉领域,深度学习技术已经取得了显著的成果,尤其是在图像识别、目标检测等方面。YOLOv11是YOLO系列模型的最新版本,结合了卷积神经网络(CNN)和其他创新技术。它在保持高精度的同时,显著提高了推理速度。YOLOv11的结构轻量且高效,非常适合实时目标检测任务。人脸检测的目标是从图像或视频中定位所有人脸的位置。

FJN110的博客 149

SQL索引的使用以及

来自B站尚硅谷课程总结。

m0_50677223的博客 945

SQL索引以及

我们不管在写代码,或者对执行数据库操作的时候,SQL化是不可缺少的一环。所以这个功能至关重要。下面我们来说说SQL语句化: 定位慢查询 show status like 'connections' ------------------------当有多少客户端连接数据库 show status like 'slow_queries'----------------------查询有多少......

wszhm123的博客 3271

sql化----索引(你奶奶看了都能学会)

通过创建索引数据库可以直接定位到包含所需数据的位置,避免了全表扫描,从而大大提高了查询效率。特别是在处理大数据量时,索引能够显著减少查询时间。索引就好比一本书的目录部分,通过目录找到对应文章的页码,便可以快速定位到需要的文章。B-Tree和B+Tree目前大部分数据库系统及文件系统都采用B-Tree和B+Tree作为索引结构。如上图是一个b+树。

m0_68882181的博客 1555

MySQL索引化与性能

通过慢查询日志获取到慢查询语句后,我们需要对慢查询语句进行分析。一条查询语句在经过MySQL查询化器的各种基于成本和规则的化会会后生成一个执行计划,这个执行计划展示了具体执行的查询方式,比如多表连接的顺序是什么,对于每个表采用什么访问方法来具体执行查询等等。EXPLAIN语句来帮助我们查看某个查询语句的具体执行计划,因此我们弄清楚执行计划的各个输出项代表的含义,从而可以有针对性的提升查询性能。通过使用EXPLAIN关键字。

码农郭大大的博客 2635

MySQL索引SQL手册

MySQL索引 MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 ...

Java笔记虾 4083

MySQL SQL索引设计

SQL索引化设计是提升数据库性能的关键步骤

KD357wtt的博客 871

SQL索引

作为一个两年的java开发者,从A公司跳槽到B公司,给大家总结一下我遇到的面试题目,并且从今天开始要总结自己掌握的东西分享给大家。 数据库 一.SQL索引 索引 1.创建索引 Create UNIQUE INDEX index_name ON TableName(col_name) 2.索引类型 Single column 单行索引 Concatenated 多行索引 Unique 唯...

qq_42208745的博客 214

MySQL索引SQL,b站自整理笔记

在关系数据库中,索引是一种数据结构,他将数据提前按照一定的规则进行排序和组织,能够帮助快速定位到数据记录的数据减少数据扫描返回更少数据减少交互次数减少服务器CPU及内存开销。

qdm778890的博客 1635

SQL实战手册:索引、并行、参数一站式解决方案

摘要:KingbaseES数据库性能指南,从索引化、执行计划分析到参数整,提供系统性解决方案。索引是基础,需根据场景选择Btree、Hash等类型,并掌握表达式索引、联合索引等高级用法。进阶化需看懂执行计划,必要时使用HINT干预。高级化包括参数和并行查询,充分利用硬件资源。实战技巧如SQL改写、物化视图可显著提升性能。最后强需分层递进,改一项验证一项,配合监控工具实现长期稳定。该指南适用于开发和DBA,能有效解决企业级业务中的慢SQL问题。

稻草人 1万+

SQL-索引详解面试题

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux…等等,会持续更新。

qq_42872034的博客 1677

MySQLSQL中的索引

(一)先说下的步骤吧 1、使用工具去发现慢SQL,工具有SkyWalking、VisualVM、JavaMelody、Alibaba Druid 等等。 2、分析慢SQL、常用SQL前加explain 3、使用索引,看最总执行SQL时间,如果能控制到100-200ms(参考值)是不错的SQL了,当然这个得结合系统实际使用来看。 (二)MySQL存储使用的数据结构 1)、索引有 B-Tree索引、hash索引、全文索引、空间索引 1、二叉树->平衡二叉树->B-Tree->B+Tre

A_234_789的博客 388

Sql指南:提升数据库性能的关键策略

Sql指南:提升数据库性能的关键策略

1035

SQL

SQL化、

蓝影铁哥的博客 360

MySQL 中如何进行 SQL

MySQL中进行SQL是一个系统性工程,需结合索引化、查询改写、性能分析工具、数据库设计及硬件配置等多方面策略。通过以上策略,可显著提升MySQL查询性能,但需根据实际场景权衡利弊,避免过度化。

篱笆院的狗的博客 1149

数据库设计和SQL基础语法】--索引化--SQL语句性能

数据库性能中,首先应明确性能指标,关注响应时间和资源利用率。通过分析 SQL 执行计划和使用数据库工具解析执行计划,可以发现潜在性能问题。在数据库设计阶段,规范化与反规范化、索引设计、表分区和分表等技术有助于提高查询效率。在 SQL 查询中,选择合适的字段、连接方式,以及避免使用子查询等化技巧能显著提高性能。通过使用合适的数据类型、存储过程和函数,可以化存储和执行效率。最后,监控与试是关键步骤,定期检查系统和数据库性能,解决慢查询、锁问题、异常和内存泄漏等,确保数据库稳定运行。

喵叔 865

SQL索引

本文总结了MySQL数据库性能化的七大核心策略:1)SQL索引化(合理建索引、避免失效、覆盖索引);2)表结构化(选择合适类型、避免NULL、分表);3)执行计划分析(EXPLAIN、慢查询);4)架构化(读写分离、缓存);5)服务器配置(参数、SSD);6)开发规范(批量操作、避免N+1查询);7)监控与持续改进。通过索引化、查询重构、分库分表等技术组合,性能可提升数十倍。建议采用"分析-化-验证"的闭环流程,重点解决慢查询、高并发等关键问题。

qq_61723836的博客 723

基于MATLAB/Simulink的通信系统建模与仿真课程设计:AWGN信道下BPSK与QPSK制比较

本资源文件提供了一个基于MATLAB/Simulink的通信系统建模与仿真课程设计,主要研究了在AWGN(加性高斯白噪声)信道下,BPSK(二进制相移键控)与QPSK(四进制相移键控)制的性能比较。设计了一个数字通信系统,该系统通过仿真分析了在不同信噪比(SNR)下,数据通过高斯信道时BPSK和QPSK的误码率(BER)。此外,本文还对BPSK和QPSK的制与解过程进行了简要介绍,并详细研究了这两种制方法在各个性能指标上的比较。主要内容系统建模:使用MATLAB/Simulink搭建了一个完整的数字通信系统模型。包括信号源、制器、信道模型、解器和误码率计算模块。制与解:简要介绍了BPSK和QPSK的制与解原理。通过Simulink模块实现了BPSK和QPSK的制与解过程。信道模型:使用AWGN信道模型模拟实际通信环境中的噪声影响。通过改变信噪比(SNR)参数,研究不同噪声环境下系统的性能。性能分析:通过仿真计算了BPSK和QPSK在不同SNR下的误码率(BER)。比较了两种制方法在误码率、带宽效率、功率效率等方面的性能。结果与讨论:分析了仿真结果,讨论了BPSK和QPSK在不同信噪比下的性能差异。总结了两种制方法的缺点,并提出了在实际应用中的建议。

上一篇: Moveit笔记
下一篇: Redis数据结构应用场景及持久化原理
split_second
博客等级 码龄12年 0粉丝 · 20原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值