文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

笛卡尔连接

例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的有多少条

 //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:

     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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯