SQL优化很难怎么办?给你一个简单暴力的办法

SQL优化很难怎么办?给你一个简单暴力的办法今天给大家带来一个比较简单SQL优化案例,来分析一下开发人员经常感到不解一个问题——视图合并导致的SQL变慢 例如: 一个运维人员(这里的运维指的是,在现有的系统上,进行稍微修改) 因为业务上的改变…

今天给大家带来一个比较简单SQL优化案例,来分析一下开发人员经常感到不解一个问题——视图合并导致的SQL变慢

例如:
一个运维人员(这里的运维指的是,在现有的系统上,进行稍微修改)
因为业务上的改变,在原有的SQL上添加了一个条件,结果原来运行很快的SQL有可能变慢,甚至会发生time out (当然导致这种情形的原因很多,种类也比较多)这里只讨论一种情况即视图合并导致的SQL变慢。
本文讲的只是一种情况,若想从根本上解决这类问题,需要熟练掌握执行计划。

CREATE TABLE `salaries09` (
 id bigint not null auto_increment primary key ,
 `emp_no` int(11) NOT NULL,
 `salary` int(11) NOT NULL,
 `from_date` date NOT NULL,
 `to_date` date NOT NULL,
 KEY ix_t1 (`emp_no`,`from_date`),
 KEY `emp_no` (`emp_no`),
 KEY `from_date` (`from_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

代码100分

有如上表和数据,原来的运行的SQL 如下

代码100分select * from ( select * from salaries09 where emp_no between 10001 and 10101 order by emp_no )v ;

若原来的SQL 会运行很快,没有问题。

但由于后来业务上的改变需要添加一些条件

修改之后的SQL 如下

select * from ( select * from salaries09 where emp_no between 10001 and 10101 order by emp_no )v where from_date = "1986-06-26" ;

假设修改后导致变慢了 !
如果碰到,这类问题,该怎么办呢?

最简单的方法是比较修改前后的执行计划,

然后发现不同之处,修改成原来的执行计划就可以。

以这个案例为例,修改前:

代码100分root@mysql3306.sock>[employees]> desc select * from (
 -> select * from salaries09 where emp_no between 10001 and 10101 order by emp_no
 -> )vG
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: salaries09
 partitions: NULL
 type: range
possible_keys: ix_t1,emp_no
 key: ix_t1
 key_len: 4
 ref: NULL
 rows: 13704
 filtered: 100.00
 Extra: Using index condition
1 row in set, 1 warning (0.00 sec)

修改后:

root@mysql3306.sock>[employees]> desc select * from (
 -> select * from salaries09 where emp_no between 10001 and 10101 order by emp_no
 -> )v where from_date = "1986-06-26" G
*************************** 1. row ***************************
 id: 1
 select_type: SIMPLE
 table: salaries09
 partitions: NULL
 type: ref
possible_keys: ix_t1,emp_no,from_date
 key: from_date
 key_len: 3
 ref: const
 rows: 8
 filtered: 3.80
 Extra: Using index condition; Using where; Using filesort
1 row in set, 1 warning (0.00 sec)

发现执行计划改变了,

1.那我们可以使用hint 或者 视图巩固的方法进行固定就可以。

2.更深层的就需要分析统计信息,是否相对真实的反映了当前的数据量。

3.也有可能,如果数据倾斜比较严重,就需要引入直方图等等。

如果说,这些知识我都不会,我就想简单,直接,有效的方法,那怎么办呢?

以上述例子为例,就是单指有视图的情况!

添加一个 limit 10000000000000

至少大部分情况下能保证:假设原来的SQL很快,修改之后也很快。

修改成如下 :

desc select * from ( select * from salaries09 where emp_no between 10001 and 10101 order by emp_no limit 10000000000000 )v where from_date = "1986-06-26" G
*************************** 1. row ***************************
 id: 1
 select_type: PRIMARY
 table: <derived2>
 partitions: NULL
 type: ref
possible_keys: <auto_key0>
 key: <auto_key0>
 key_len: 3
 ref: const
 rows: 10
 filtered: 100.00
 Extra: NULL
*************************** 2. row ***************************
 id: 2
 select_type: DERIVED
 table: salaries09
 partitions: NULL
 type: range
possible_keys: ix_t1,emp_no
 key: ix_t1
 key_len: 4
 ref: NULL
 rows: 13704
 filtered: 100.00
 Extra: Using index condition
2 rows in set, 1 warning (0.00 sec)

如此也能解决问题!


本文节选自松华老师的《SQL优化专栏》

郑松华,知数堂SQL 优化班老师

现任 CCmediaService DBA,主要负责数据库优化相关工作

擅长SQL优化 ,数据核对


对文章感兴趣的朋友们可以加我哦,这里有一个乐于交友的人鸭!

SQL优化很难怎么办?给你一个简单暴力的办法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10794.html

(0)
上一篇 2022-12-21
下一篇 2022-12-21

相关推荐

  • 生产库上在线不停机搭建dataguard[通俗易懂]

    生产库上在线不停机搭建dataguard[通俗易懂]此方案适合于生产运营中的数据库,DB服务器停机时间非常苛刻,或无法停机维护的情况下,如支付,电商等业务,可通过该方案在线部署Dataguard,对客户系统无任何影响。 此方案适合于生产运营中的数据库…

    2022-12-22
    148
  • NumPy数组添加元素方法详解

    NumPy数组添加元素方法详解NumPy是Python中用于科学计算的核心库之一,它提供了高性能的多维数组对象以及相关工具。在NumPy中,向数组中添加元素是一个经常需要用到的操作。因此,本文将详细介绍使用NumPy数组添加元素的方法,以帮助读者更好地理解和使用NumPy库。

    2024-09-06
    23
  • 【转】MySQL合理使用索引[亲测有效]

    【转】MySQL合理使用索引[亲测有效]索引可以说是数据库中的一个大心脏了,如果说一个数据库少了索引,那么数据库本身存在的意义就不大了,和普通的文件没什么两样。所以说一个好的索引对数据库系统尤其重要,今天来说说MySQL索引,从细节和实际业

    2023-05-01
    151
  • 腾讯资深架构带你深入MyBatis技术原理与实战[通俗易懂]

    腾讯资深架构带你深入MyBatis技术原理与实战[通俗易懂]【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 前言 本书主要讲解了MyBatis 的应用。从目前的情况来看,国内图书市场上没有介绍 MyBatis的书籍,有的只是官方的API…

    2023-02-03
    149
  • 如何使用Python更新

    如何使用Python更新Python是一个广泛使用的编程语言,在不同领域都有广泛的应用,包括Web应用、科学计算、人工智能等。Python具有易于编写、易于理解及易于维护等特点,因此目前越来越多的开发人员选择使用Python。

    2024-08-20
    28
  • Python字符串遍历技巧:如何以

    Python字符串遍历技巧:如何以Python是一种高级编程语言,具有简单易学的特点。针对字符串的操作函数也多种多样,其中以字符串遍历为一大特色,可以方便地取出字符串中的字符,通过组合拼凑的方式得到新的字符串。

    2024-07-10
    47
  • Ubuntu20 安装mysql8并开启远程访问

    Ubuntu20 安装mysql8并开启远程访问ubuntu20.04使用命令安装数据库默认就是8.x版本的 1.安装 sudo apt-get install mysql-server mysql-client 2.修改配置文件 sudo vi…

    2023-04-12
    158
  • dataguard ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

    dataguard ORA-12514: TNS:listener does not currently know of service requested in connect descriptor错误的意思是listener 不知道连接解析器中的请求服务,这里要说静态监听和动态监听了动态注册是在instance启动的时候PMON进程根据init.ora中的instance_name,servi

    2022-12-26
    164

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注