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

MySQL 查询优化

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

MySQL 查询优化

查询优化常用策略

  1、优化数据访问:应用程序应该减少对数据库的数据访问,数据库应该减少实际扫描的记录数

     例如,Redis缓存,避免"select * from table"

  2、重写SQL

     对于需要进行大量数据的操作,可以分批执行,以减少对生产系统的影响,从而缓解复制超时

MySQL join 严重降低了并发性,应该尽量连接太多的表,建议在应用层实现部分的连接功能

  3、重新设计库表

      在没有其他的优化办法下,可以考虑更改表结构设计,增加缓存表,暂存统计数据,或者增加冗余列,以减少连接

  4、索引

     索引能解决80%的问题

 

优化器介绍

  优化器的不足

   1、数据的统计信息可能是错误的

   2、CPU,内存、数据是否在缓存,都会影响优化器

   3、优化器不会考虑并发的情况,资源的郑永可能会导致性能问题

   提示:

   1、使用索引

   select * from table1 use index(col1_index,col2_index) where col1=1 and col2=2 and col3=3;

   2、不使用索引

      select * from table1 ignore index(col3_index) where col1=1 and col2=2 and col3=3;;

   3、强制使用索引

     select * from table1 force index(col3_index) where col1=1 and col2=2 and col3=3;;


    注意:use index,ignore index,force index 只会影响MySQL表中检索记录和连接要使用的索引,不影响order by或group by或group by


   4、不使用查询缓存

     SQL_NO_CACHE

   5、使用查询缓存  explicit_mode,query_cache_type=2 ,指明SQL需要缓存,才缓存

    SQL_CACHE

  6 、Straight_join

     按照FROM字句描述的表的顺序进行连接

 

MySQL的连接机制

   Nested Loop join

   MySQL优化器一般会选择小表来做驱动表(外部表)


   

各种语句的优化

连接的优化

 1、连接的表不要超过4个

 2、ON,using子句的列要有索引

 3、最好能转换为inner join,left join的成本比inner join高很多

 4、explain检查连接,如果输出的rows列太高,考虑索引或连接表顺序是否不当

 5、反范式设计

 

group by、distinct、order by语句优化

1、尽量对较少的行进行排序

2、连接了多张表,order by 的列应该属于连接顺序的第一张表

3、 利用索引排序

4、group by,order by的列尽量是第一表中的列,如果不是,考虑冗余列

5、保证索引列和order by的列相同,而且按相同的方向进行排序

6、增加sort_rnd_buffer_size

7、改变tempdir变量指向基于内存的文件系统或者其他更快的磁盘

8、指定Order by null

  默认情况下MySQL将排序所有的Group by的查询,如果要避免排序结果,可以指定Order by null;

9、优化Group by with rollup

   考虑在应用层实现

10、使用非group by的列来替代group by的列

   比如 group by x,y,如果group by z 能到到相同的结果,则尽量少出现group by

11、考虑用Sphinx替代 group by语句



优化子查询

   大多数情况下,连接会比子查询快,子查询生成的临时表没有索引

   

   select distinct col1 from t1 where col1 in (select col1 from t2);

   改写为:

   select distinct t1.col1 from t1,t2 where t1.col1=t2.col1;

   

select * from t1 where id not in (select id from t2);


改写:

select * from t1 where not exists (select id from t2 where t1.id=t2.id) 

也可以改写为:

select table1.* from table1 left join table2 on table1.id=table2.id where table2.id is null;



把子句从子查询的外部转移到内部


select * from t1 where s1 in (select s1 from t1) or s1 in (select s1 from t2);

改写

select * from t1 where s1 in (select s1 from t1 union all select s1 from s2);



select (select column1 from t1) +5 from t2;

改写

select (select column1+5 from t1) from t2;








  

   


优化limit字句


优化 IN


优化Union


优化带有BLOB、Text类型字段的查询

filesort的优化


优化SQL_CALC_FOUND_ROWS

优化临时表



OLAP业务优化





免责声明:

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

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

MySQL 查询优化

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

下载Word文档

猜你喜欢

mysql优化——查询优化

这一篇mysql优化是注重于查询优化,根据mysql的执行情况,判断mysql什么时候需要优化,关于数据库开始阶段的数据库逻辑、物理结构的设计结构优化不是本文重点,下次再谈。 查看mysql语句的执行情况,判断是否需要进行优化 当感觉操作数据库查询语句速度
mysql优化——查询优化
2016-09-05

mysql查询优化

select * from a where id in (select id from b)等价于:for select id from bfor select 8 from a where a.id = b.id当b表数据必须小于a表数据时,in优于exis
mysql查询优化
2022-02-02

Mysql查询优化之IN子查询优化方法详解

这篇文章主要给大家介绍了关于Mysql查询优化之IN子查询优化的相关资料,需要的朋友可以参考下
2023-02-09

如何优化MySQL查询

这篇文章给大家介绍如何优化MySQL查询,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。解析器和预处理器一开始,MySQL 的解析器将查询语句拆分成一系列指令并从中构建一棵“解析树”。解析器使用 MySQL 的SQL 语
2023-06-15

mysql查询语句优化

这篇说下mysql查询语句优化是否请求了不需要的数据典型案例:查询不需要的记录,多表关联时返回全部列,总是取出全部列,重复查询相同的数据。是否在扫描额外的记录最简单的衡量查询开销的指标。响应数据扫描的行数返回的行数 访问类型在评估查询开销
2022-05-11

mysql in慢查询优化

目录记一次mysql慢查询优化——生产环境待办列表现场演示5android~6s才加载出来结果;顿时,产品经理的脸挂不住了,作为多年经验的老开发,心想完犊子,脸啪啪滴。不过,秉着多年的江湖经验,遇事不慌,拍个照先。
2023-05-12

MySQL查询优化之一

我们深入理解了MySQL的索引,有了MySQL索引可以一定程度上提高MySQL的查询速度。这一期我们来学习下MySQL查询性能优化的一般方法。

mysql-查询性能优化

1、不要取出全部列,取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。应该严格禁止SELECT * 的写法。MySQL使用如下三种方式应用WHERE条件,从好到坏依次为:  1.1 在索引中使用WHERE条件
mysql-查询性能优化
2021-02-18

MySQL查询优化临时表

【理论分析】MySQL在执行SQL查询时可能会用到临时表,一般情况下,用到临时表就意味着性能较低。临时表存储MySQL临时表分为“内存临时表”和“磁盘临时表”,其中内存临时表使用MySQL的MEMORY存储引擎,磁盘临时表使用MySQL的MyISAM存储引擎;
2019-09-24

MySQL查询优化利刃-EXPLAIN

有一个 ?遇到这样一个疑问:当where查询中In一个索引字段作为条件,那么在查询中还会使用到索引吗?SELECT * FROM table_name WHERE column_index in (expr)上面的sql语句检索会使用到索引吗?带着这个问题,在
MySQL查询优化利刃-EXPLAIN
2019-04-17

MySQL优化LIMIT分页查询

在MySQL中,使用LIMIT关键字进行分页查询时,如果查询结果集很大,可能会导致性能问题。为了优化LIMIT分页查询,可以采用以下方法:使用索引:确保查询中涉及到的列都已经建立了索引,这样可以大大提高查询速度。同时,尽量避免在WHERE子
MySQL优化LIMIT分页查询
2024-10-20

mysql查询慢怎么优化

mysql 查询变慢的原因包括:索引不足、表结构不当、查询语句不佳、硬件限制。优化策略包括:优化索引、优化表结构、优化查询语句、提高硬件性能、使用缓存、监控性能、自动化优化。MySQL 查询优化指南问题:MySQL 查询为何会变慢?My
mysql查询慢怎么优化
2024-05-22

MySQL优化(4):查询缓存

查询缓存:MySQL提供的数据缓存QueryCache,用于缓存SELECT查询的结果默认不开启,需要在配置文件中开启缓存(my.ini/my.cnf)在[mysqld]段中,修改query_cache_type完成配置:0:关闭1:开启,但是默认缓存,需要增
MySQL优化(4):查询缓存
2018-07-13

编程热搜

目录