我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SQL性能优化方法及性能测试

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SQL性能优化方法及性能测试

笛卡尔连接

例1: 没有携带on的条件字句,此条slq查询的结构集等价于,a表包含的条数*b表包含的乘积:

select * from table a cross join table b;

例2:拥有携带on字句的sql,等价于inner join

select * from table a cross join table b on a.id=b.id;

分页limit的sql优化的几种方法

规则;表包含的数据较少的数据量,作为驱动表(小表驱动大表,一般mysql的优化器会做出相应的优化的,但是为了防止一些抽风现象可以用STRAIGHT_JOIN,作用会强制使用左边的表作为驱动表)。

例1:

select * from table c straight_join table d on c.id=d.id;

覆盖索引:

select 主键字段或者创建过索引的字段 from table limit 300000,10

索引覆盖+inner (业界常用的优化方案)

select * from table a
inner join (
select 创建索引的字段 from table  limit 30000,10) b
on b.创建索引的字段=a.创建索引的字段 (也可以更换为 using (创建索引的字段))

索引覆盖+子查询 先获取分页起始的最小值,然后再获取后10条 (业界常用的优化方案)

select * from table
where 主键字段或者创建过索引的字段
                  >=
(select 主键字段或者创建过索引的字段 from table 300000,1)
limit 10;

范围查询+limit语句 获取上一页的主键最大值,然后进行获取后面的数据;

例1; 上一页的最大主键值为100

  select * from table
     where id > 100
     limit 10;

需要获取起始主键值和结束主键值

select * from table
          where id between 起始主键值 and 结束主键值;

禁止传入过大的页码 (例如;百度就是采用这种方式)

count 优化方案

实例1:

    
select count(*) from table

实例2:

    
select count(某个字段) from table 会把此字段的值为null过滤掉,仅仅只统计字段值不为null的

实例3:

    //做完本条查询,去执行count的操作
    select sql_calc_found_rows * from table limit 0,10;
    select found_rows() as count ;  通过此sql来获取count的结果(须在终端进行执行)

注意:缺点在mysql8.0.17这种用法已经被废弃,未来会被永久删除

实例4:优点不操作具体的表,无论表的数据量有多大,都可以迅速执行. 缺点:统计的是一个估算值,适合要求统计数的精度不是太高的场景。

    select * from information_schema.TABLES
    where
       TABLE_SCHEMA='数据库名称'
    and
       TABLE_NAME ='表的名称';

实例5: //优点不操作具体的表,无论表的数据量有多大,都可以迅速执行. 缺点:统计的是一个估算值,适合要求统计数的精度不是太高的场景。

  show table status where NAME='表的名称隔行'

实例6: //优点不操作具体的表,无论表的数据量有多大,都可以迅速执行. 缺点:统计的是一个估算值,适合要求统计数的精度不是太高的场景。

 explain select * from table

实例7: 优化案例; 目前有一张数量非常大的表,需要统计id值大于100的有多少条

  • 一般写法:select count(*) from table where id>100;
  • mysql8.18版:逆向思维的写法: select count()-(select count() from table where id <100) from table
  • order by 的优化:原则利用索引,避免排序。
 //first_name,last_name已经在表里创建了组合索引,emp_no为主键;

实例1:

//此sql是不能利用到索引的,原因是:mysql的优化器,是根据成本计算的,如果全表扫描比使用索引,成本更低时会使用全表扫描
//如何鉴定是否使用索引避免了排序呢? 通过explain 查看sql的性能如果Extra的值为null时,说明是可以通过索引避免排序的.如果Extra的值是Using filesort 是不可以进行索引排序的
select * from table order by first_name,last_name;
//此sql可以使用索引避免排序的
select * from table order by first_name,last_name limit 10;
//此sql可以使用索引避免排序的

select * from table where fist_name='Bader' order by last_name;
//此sql可以使用索引避免排序的

select * from table where fist_name<'Bader' order by last_name
//此sql可以使用索引避免排序的
 select * from table where fist_name='Bader' and last_name>'Peng' order by last_name
 //此sql可以使用索引避免排序的,原因排序的俩个字段,分别存在俩个索引中
 select * from table  order by first_name,emp_no;

索引失效的场景:

  • 1: join 字段的类型不一致
  • 2: 在=号的左边,进行加减操作

实例1:

     select * from employees e
     left join dept_emp de on e.emp_no=de.emp_no
     left join departments d on de.dept_no=d.dept_no
     where e.emp_no=1001;

拆分后:

    select * from employees where emp_no='1001';
    select * from dept_emp where emp_no='1001';
    select * from departments where dept_no='d005';

表的设计原则-三范式:

  • 范式:表的字段都是原子性,既每个表的字段都是不可分割的,不是集合,数组,记录等非原子数据项。
  • 范式:在第一范式的基础上,每一行数据的唯一性,非主键字段要完全依赖于主键字段。
  • 范式:在满足第二范式的基础上,不能存在传递依赖。

到此这篇关于SQL性能优化方法及性能测试的文章就介绍到这了,更多相关SQL性能优化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SQL性能优化方法及性能测试

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP中封装性的性能测试与优化方法

摘要:在PHP开发中,封装性的重要性不言而喻。好的封装性可以提高代码的可读性、维护性和复用性。然而,过于复杂的封装可能会导致性能问题。本文将介绍一些测试和优化方法,帮助你确保封装性和性能的平衡。性能测试工具在进行性能测试之前,我们需要一个可
2023-10-21

Go函数性能优化:基准测试与性能分析方法

了解 go 函数性能优化至关重要,可以通过以下方法实现:基准测试:使用 go 的 testing 包测量执行时间和资源消耗,例如基准测试字符串连接策略。性能分析:使用 runtime/pprof 包生成函数调用图,通过 go tool pp
Go函数性能优化:基准测试与性能分析方法
2024-05-03

优化云性能:云性能测试及其优势的深入指南

本文解释了云性能测试的类型、不同形式、好处、好处和常用工具。

PHP 性能优化:基准测试与性能对比

php 应用程序性能优化至关重要,通过基准测试和性能对比可识别优化领域。基准测试有助于衡量应用程序性能,可用工具包括 apachebench 和 jmeter。性能对比将优化后的应用程序与未优化应用程序进行比较,以量化改进。常见的性能优化技
PHP 性能优化:基准测试与性能对比
2024-05-10

Linux 性能基准测试工具及测试方法

Super_Pi 是一种用于计算圆周率π的程序,通常用于测试计算机性能和稳定性。它的主要用途是测量系统的单线程性能,因为它是一个单线程应用程序。

Golang函数性能优化之测试与分析方法

在 go 中优化函数性能至关重要。使用性能分析工具和基准测试可以测试和分析函数:基准测试:使用 benchmark 函数比较函数实现的性能。性能分析:使用 pprof 包中的工具(如 cpuprofile)生成性能分析配置文件。实战案例:分
Golang函数性能优化之测试与分析方法
2024-04-17

SQL性能优化策略之索引优化方法

SQL优化是优化工作中经常会涉及的问题,由于早期的开发人员往往只关注于SQL功能的实现,而忽略了性能。特别是复杂的SQL,上线之后很少修改,一旦出现问题,即使是当初的开发人员自己也很难理清其中的业务逻辑,需要花费大量的时间去理解代码之间的
SQL索引性能2024-12-03

Android性能优化以及数据优化方法

Android性能优化-布局优化 今天,继续Android性能优化 一 编码细节优化。 编码细节,对于程序的运行效率也是有很多的影响的。今天这篇主题由于技术能力有限,所以也不敢在深层去和大家分享。我将这篇主题分为以下几个小节: (1)缓存
2022-06-06

QEMU/KVM + Ceph Librbd 性能测试以及深度优化

对于 16K 的 IO,qemu+librbd 经过仔细调优后,可以从单个 VM 实现 64-67K 的随机写入 IOPS 和 123K 的随机读取 IOPS。即使在使用 libssl 的 AES-NI 支持时,在 Ceph 中启用 128

Golang 技术性能优化中如何进行性能测试?

进行性能测试对于优化 go 应用程序至关重要,可以通过使用各种工具,例如 bencher、pprof、httperf 和 wrk,来评估应用程序在特定负载下的性能,包括响应时间、吞吐量和资源利用率等指标。实战案例中演示了如何使用 wrk 测
Golang 技术性能优化中如何进行性能测试?
2024-05-11

【性能优化】性能测量工具-LightHouse

Lighthouse是Google开发的一款开源工具,提供一套全面的测试来评估网页质量,包括加载性能、可访问性、最佳实践和PWA。在chrome 60之后的版本,DevTool里已经内置了Lighthouse。

【性能优化】性能测量工具-WebPageTest

WebPagetest的核心是用于测量和分析网页的性能。它是 google 开源项目《make the web faster》的子项目,它本来是 AOL 内部使用的工具,后来在2008年基于BSD开源。

Android性能优化方法

GPU过度绘制 打开开发者选型,“调试GPU过度绘制”,蓝、绿、粉红、红,过度绘制依次加深 粉红色尽量优化,界面尽量保持蓝绿颜色 红色肯定是有问题的,不能忍受使用HierarchyView分析布局层级 删除多个全屏背景:应用中不可见
2022-06-06

如何优化shell性能测试脚本

如何优化shell性能测试脚本?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。脚本名称:authTest.sh#!/bin/bashfor ((i=0;i<=1000;i++))
2023-06-09

性能优化指南:性能优化的一般性原则与方法

【本文转自博客园 作者:xybaby 原文链接:https://www.cnblogs.com/xybaby/p/9055734.html】作为一个程序员,性能优化是常有的事情,不管是桌面应用还是web应用,不管是前端还是后端,不管是单点应
2023-06-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录