首页 > 数据库 >MySQL中的sql优化

MySQL中的sql优化

时间:2023-01-02 20:34:18浏览次数:42  
标签:salary where employees MySQL sql SQL 优化 id select

目标:

  掌握SQL调优的原则

  掌握SQL调优的基本逻辑

  掌握优秀SQL的编写方案

  掌握何为慢SQL以及检测方案

SQL优化原则

1、减少数据量(表中数据太多可以分表,例如超过500万数据  双11一个小时一张订单表)

2、减少数据访问量(将全表扫描可以调整为基于索引去查询)

3、减少数据计算操作(将数据库中的计算拿到程序内存中计算)

SQL优化的基本逻辑

1、良好的SQL编码习惯(熟悉SQL编码规范、例如避免使用“select * “)

2、优秀SQL的编写逻辑(例如关联时遵循小表驱动大表)

3、定位需要优化的慢SQL语句(耗时多少时间的SQL是慢SQL)

4、调整优化策略并进行测试(SQL结构上的调整、索引应用)

5、按业务进行分库分表。(分表可以在应用逻辑中减少单表数据量)

优秀的SQL编写方案

1、查询时尽量避免使用 select *。

  这样可以减少数据扫描以及网络开销(很多查询不需要查询所有列)

  要尽量使用覆盖索引(索引中已经包含你需要的数据)、减少回表查询

    如何查询会基于salary找到雇员id,然后基于雇员id再去查hire_date.(回表) 

      create index index_salary on employees(salary);
      select employee_id,salary,hire_date
      from employees
      where salary>15000
    优化方案:
      create index index_salary on employees(salary,hire_date);
      select employee_id,salary,hire_date
      from employees
      where salary>15000

2、尽量避免在where子句中使用 or 作为查询条件

  or可能会使索引失效,进而执行全表扫描

  全表查询的效率相对基于索引查询的效率会比较低

    例如:

      create index index_salary on employees(salary);

      select first_name,hire_date,salary

      from employees

      where job_id='AD_VP' or salary>15000

    优化方案:将or操作换成union操作

      select first_name,hire_date,salary

      from employees

      where job_id='AD_VP'

      union all(union 是将查询结果去重)

      select first_name,hire_date,salary

      from employees

      where salary>15000

3、where条件中尽量不要出现null值的比较

  条件中包含和null值的比较时可能会不走索引,当然这也跟SQL优化器有关,优化器有时会因为数据量的多少,对是否走索引进行评估,假如它认为不走索引效率可能会更        高,可能就不走索引了。

       select first_name,salary,commission_pct

       from employees

       where commission_pct is null

4、避免在查询中存在隐式转换

     create table tb_order
     (
        id int primary key,
        user_id varchar(50) not null,
        index index_user_id (user_id)
     )
     select * from tb_order where user_id=1; 这里存在隐式转换,有可能不走索引
     select * from tb_order where user_id='2'; 推荐

5、避免在where子句中使用 != 或 <> 操作符

 

标签:salary,where,employees,MySQL,sql,SQL,优化,id,select
From: https://www.cnblogs.com/yangcrazy/p/17020461.html

相关文章

  • MySQL中的索引应用
    1.什么是索引(Index)?官方的定义是索引是一种数据结构,从生活的纬度上讲,假如将一本书比作成一张表,这本书的目录就是表中的索引(Index)。2.索引的优势和劣势?优势:数据量比较大......
  • ORM查询优化、ORM事务操作、ORM相关字段类型及参数
    ORM查询优化、ORM事务操作、ORM相关字段类型及参数目录ORM查询优化、ORM事务操作、ORM相关字段类型及参数ORM查询优化ORM事务操作ORM常用字段类型ORM自定义字段类型ORM常......
  • 针对于Sql server突然连接不到服务器的解决方法
    问题叙述点击连接之后,总是会弹出一个错误弹窗:方法解决快捷键Win+R,输入services.msc,进入到服务界面:找到SQL代理(DEV)将手动打开改成自动再连接试一次连上啦!(希望......
  • 关于MySql链接url参数的设置 专题
    报错:EstablishingSSLconnectionwithoutserver'sidentityverificationisnotrecommended.AccordingtoMySQL5.5.45+,5.6.26+and5.7.6+requirementsSSLconnec......
  • SQL注入之查询方式和报错盲注
    当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能就是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,......
  • SQL注入之Oracle,mongoDB等注入
    常见数据库:access、mysql、mssql、MongoDB、postgresql、sqlite、oracle、sybase等Access是没有库之分,比其他数据库低一个等级。目前在市面上的access已经很少了,和asp语言......
  • SQL注入之二次加解密,DNS等注入
    二次注入原理(主要分为两步)第一步:插入恶意数据第一次进行数据库插入数据的时候。仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包......
  • SQL堆叠注入及waf绕过注入;SQL注入之SQLMAP绕过WAF
    堆叠查询注入Stackedinjections(堆叠注入)从名词的含义就可以看到应该是一堆sql语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在mysql中,主要是命令......
  • SQL注入之简要SQL注入
    SQL注入安全测试中的危害:危害数据库里的数据(因为可以直接写入);直接危害到网站的权限。SQL注入产生原理详细分析:l 通过sqlilabs代码分析;l SQL语句在定义时没有变量,就......
  • SQL注入之MYSQL注入
    前言:MYSQL注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行geshell操作。其中也会遇到很多阻碍,相关的防御反感也要明确。高权限注入及低权限......