阅读目录

  • 1、简介
  • 2、截取SQL语句
  • 3、查询优化基本分析命令
  • 4、查询优化几个方向
  • 5、索引优化
  •   5.1、索引优点:
  •   5.2、索引缺点
  •   5.3、索引选择
  •   5.4、索引细究
  • 6、子查询优化
  • 7、等价谓词重写:
  • 8、条件化简与优化
  • 9、外连接优化
  • 10、其他查询优化
  • 11、博文总结
回到顶部

1、简介

一个好的web应用,最重要的一点是有着优秀的访问性能。数据库MySQL是web应用的组成部分,也是决定其性能的重要部分。所以提升MySQL的性能至关重要。

MySQL性能的提升可分为三部分,包括硬件、网络、软件。其中硬件、网络取决于公司的财力,需要白哗哗的银两,这里就不说啦。软件又细分为很多种,在这里我们通过MySQL的查询优化从而达到性能的提升。

最近看了一些关于查询优化的书籍,同时也在网上看一些前辈们写的文章。

以下是自己整理借鉴关于查询优化的一些总结:

回到顶部

2、截取SQL语句

1、全面查询日志

2、慢查询日志

3、二进制日志

4、进程列表

  SHOW FULL PROCESSLIST;

  。。。

回到顶部

3、查询优化基本分析命令

  1、EXPLAIN {PARTITIONS|EXTENDED}

  2、SHOW CREATE TABLE tab;

  3、SHOW INDEXS FROM tab;

  4、SHOW TABLE STATUS LIKE ‘tab’;

  5、SHOW [GLOBAL|SESSION] STATUS LIKE ‘’;

  6、SHOW VARIABLES

  。。。。

  ps:我自己都感觉上面都是没任何营养的东西。下面才是真正的干货哈。

回到顶部

4、查询优化几个方向

  1、尽量避免全文扫描,给相应字段增加索引,应用索引来查询

  2、删除不用或者重复的索引

  3、查询重写,等价转换(谓词、子查询、连接查询)

  4、删除内容重复不必要的语句,精简语句

  5、整合重复执行的语句

  6、缓存查询结果

回到顶部

5、索引优化

回到顶部

  5.1、索引优点:

    1、保持数据的完整性

    2、提高数据的查询性能

    3、改进表的连接操作(jion)

    4、对查询结果进行排序。没索引将会采用内部文件排序算法进行排序,效率较慢

    5、简化聚合数据操作

回到顶部

  5.2、索引缺点

    1、索引需要占用一定的存储空间

    2、数据插入、更新、删除时会受索引的影响,性能会降低。因为数据变更索引也需要进行更新

    3、多个索引,优化器需要耗时则优选择

回到顶部

  5.3、索引选择

    1、数据量大时采用

    2、数据高度重复时,不采用

    3、查询取出数据大于20%,将采用全文扫描,不用索引

回到顶部

  5.4、索引细究

    资料查询:

    MySQL中的InnoDB、MyISAM都是B-Tree类型索引

    B-Tree包含:PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT

    B-Tree类型索引不支持(即字段使用以下符号时,将不采用索引):

    >, <, >=, <=, BETWEEN, !=, <>,like ‘%**’

    【在此先介绍一下覆盖索引】

    以我自己理解的方式介绍吧。覆盖索引并不是像主键索引、唯一索引一样真实存在,它只是对索引应用某些特定场景的一种定义【另一种理解:查询的列是索引列,因此列被索引覆盖】。它可以突破传统的限制,使用以上操作符,且依然采用索引进行查询。

    因为查询的列是索引列,所以不需要读取行,只需要读取列字段数据就可以了。【例如你看一本书,需要找某一内容,刚好那内容出现在目录中,那就不用一页页翻了,直接在目录中定位到第几页查找】

    如何激活覆盖索引呢?什么样才是特定场景呢?

    索引字段,在select中出现就是了。

    复合索引还可能有其他的特殊场景。例如,三列复合索引,仅需要在select、where、group by、order by中,任意一个地方出现一次复合索引最左边列就可以激活使用覆盖索引了。

    查看:

    EXPLAIN中Extra显示有Using index表示这条语句采用了覆盖索引。

    结论:

    不建议在查询的时候使用select*from进行查询了,应该写需要用的字段,并且增加相应的索引,以提高查询性能。

    针对以上操作符实测结果:

    1、以select*from形式,where中是primary key可以通杀【除like】(使用主键进行查询);index则全不可以。

    2、以select 字段a from tab where 字段a《以上操作符》形式测试,结果依然可以使用索引查询。【采用了覆盖索引】

    其他索引优化方法:

    1、使用索引关键字作为连接的条件

    2、复合索引使用

    3、索引合并or and,将涉及到的字段合并成复合索引

    4、where、和group by涉及字段加索引

回到顶部

6、子查询优化

  在from中为非相关子查询,可以上拉子查询到父层。在多表连接查询考虑连接代价再选择。

  查询优化器对子查询一般采用嵌套执行的方式,即对父查询中的每一行,都执行一次子查询,这样子查询会执行很多次。这种执行方式效率很低。

  子查询转化为连接查询优点:

  1、子查询不用执行很多次

  2、优化器可以根据信息来选择不同的方法和连接顺序

  3、子查询的连接条件,过滤条件变成父查询的筛选条件,以提高效率。

  优化:

  子查询合并,若多个子查询,能合并的尽量合并。

  子查询展开,即上拉变成多表查询(时刻保证等价变化)

  注意:

  子查询展开只能展开简单的查询,若子查询含有聚集函数、GROUP BY、DISTINCT,则不能上拉。

  select * from t1 (select*from tab where id>10) as t2 where t1.age>10 and t2.age<25;

  select*from t1,tab as t2 where t1.age>10 and t2.age<25 and t2.id>10;

  具体步骤:

  1、from与from合并,修改相应参数

  2、where与where合并,用and连接

  3、修改相应的谓词(in改=)

回到顶部

7、等价谓词重写:

  1、BETWEEEN AND改写为 >= 、<=之类的。实测:十万条数据,重写前后时间,1.45s、0.06s

  2、in转换多个or。字段为索引时,两个都能用到索引,or效率相对in好一点

  3、name like ‘abc%’改写成name>=’abc’ and name<’abd’;

  注意:百万级数据测试,name没有索引之前like比后一种查询快;给字段增加索引后,后面的快一点点,相差不大,因为两种方法在查询的时候都用到了索引。

  。。。。

回到顶部

8、条件化简与优化

  1、将where、having(不存在groupby和聚集函数时)、join-on条件能合并的尽量合并

  2、删除不必要的括号,减少语法分许的or和and树层,减少cpu消耗

  3、常量传递。a=b and b=2转换为 a=2 and b=2。尽量不使用变量a=b或a=@var

  4、消除没用的SQL条件

  5、where等号右边尽量不出现表达式计算;where中不要对字段进行表达式计算、函数的使用

  6、恒等变换、不等式变换。例:测试百万级数据a>b and b>10变为a>b and a>10 and b>10优化显著

回到顶部

9、外连接优化

  即将外连接转为内连接

  优点:

  1、优化处理器处理外连接比内连接步骤多且耗时

  2、外连接消除后,优化器选择多表连接顺序有更多选择,可以择优而选

  3、可以将筛选条件最为严格的表作为外表(连接顺序最前面,是多层循环体的外循环层),

  可以减少不必要的I/O开销,能加快算法执行的速度。

  on a.id=b.id与where a.id=b.id的差别,on则表进行连接,where则进行数据对比

  注意:前提必须是结果为NULL决绝(即条件限制不要NULL数据行,语意上是内连接)

  优化原则:

  精简查询,连接消除,等效转换,去除多余表对象连接

  例如:主键/唯一键作为连接条件,且中间表列只作为等值条件,可以去掉中间表连接

回到顶部

10、其他查询优化

  1、以下将会造成放弃索引查询,采用全文扫描

    1.1、where 子句中使用!=或<>操作符  注意:主键支持。非主键不支持

    1.2、避免使用or

      经测试,并非是使用了or就一定不能使用索引,大多情况下是没用到索引,但还有少数情况是用到的,因此具体情况具体分析。

      类似优化:

      select * from tab name=’aa’ or name=’bb’;

      =>

      select * from tab name=’aa’

      union all

      select * from tab name=’bb’;

      实测:

      1、十万数据测试,没任何索引的情况下,上面比下面的查询速率快一倍。

      2、三十万数据测试,aa与bb都是单独索引情况下,下面的查询速率比or快一点。

    1.3、避免使用not in

      not in一般不能使用索引;主键字段可以

    1.4、where中尽量避免使用对null的判断

    1.5、like不能前置百分号 like ‘%.com’

      解决:

        1、若必须使用%前置,且数据长度不大,例如URL,可将数据翻转存入数据库,再来查。LIKE REVERSE‘%.com’;

        2、使用覆盖索引

    1.6、使用索引字段作为条件的时候,假若是复合索引,则应该使用索引最左边前缀的字段名

  2、将exists代替in

    select num from a where num in(select num from b)

    select num from a where exists(select 1 from b where num=a.num)

    一百万条数据,筛选59417条数据用时6.65s、4.18s。没做其他优化,仅仅只是将exists替换in。

  3、字段定义是字符串,查询时没带引号,不会用索引,将会进行全文扫描。

  【以下是摘抄于半夜乱弹琴博文http://www.cnblogs.com/lingiu/p/3414134.html,本人没进行相应的测试】

  4、尽量使用表变量来代替临时表

  5、避免频繁创建和删除临时表,以减少系统表资源的消耗

  6、如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定

  7、尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写

  8、大数据量,若数据量过大,应该考虑相应需求是否合理。

  9、尽量避免大事务操作,提高系统并发能力。

  。。。。。

个人公众号谢谢各位老铁支持

转载于:https://www.cnblogs.com/piwefei/p/8624688.html

mysql 查询优化相关推荐

  1. MySQL高级-索引是个什么东西?explain到底怎么用-MySQL查询优化大全

    目录 一.引出问题-MySQL的查询优化: 二.性能下降的原因: 三.索引到底是什么?怎么用? 1.索引操作 查看索引: 删除索引: 创建索引: 说明: 索引命名规范: 2.索引优势: 3.索引劣势: ...

  2. MySQL查询优化-explain

    2019独角兽企业重金招聘Python工程师标准>>> 一.MySQL 查询优化器是如何工作的         MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索 ...

  3. MySQL查询优化之explain的深入解析

    在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.expla ...

  4. mysql查询优化explain命令详解

    转载自 mysql查询优化explain命令详解 mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式.explain翻译即解释,就是看mysql语句的查询解释计划,从解 ...

  5. mysql优化php面试_php面试专题---18、MySQL查询优化考点

    php面试专题---18.MySQL查询优化考点 一.总结 一句话总结: 慢查询:查找分析查询速度慢的原因 数据访问:优化查询过程中的数据访问 长难句:优化长难的查询语句 特定类型:优化特定类型的查询 ...

  6. MySQL查询优化之索引

    MySQL查询优化之索引 什么是索引 索引简单来说就类似字典,想想我们小时候在中华字典怎么查某个字.索引的作用就是快速找出在某个列中有一特定值的行. 例如:有一张user表,其中有200万条记录,记录 ...

  7. mysql查询优化之三:查询优化器提示(hint)

    目录: <MySQL中的两种临时表>--强制使用临时表 SQL_BUFFER_RESULT <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示( ...

  8. MySql查询优化性能调优,sql性能自测方法,及Mysql索引介绍

    MySql查询优化性能调优,sql性能自测方法,及Mysql索引介绍 前言 一.普通优化加索引(适用于where条件后一个查询条件) 二.组合查询加索引(适用于where条件后多个查询条件) 三.My ...

  9. 谈谈MySQL查询优化

    1.硬件优化 一般来讲,硬件的优化是成本最高效果最差的,服务器性能对数据库的读写能力的影响尤其体现在磁盘I/O上.mysql数据库频繁的CURD操作是十分吃磁盘I/O的,一般可以认为磁盘I/O是硬件方 ...

  10. MySQL查询优化详解

    mysql 查询优化-查询执行的路径 mysql 客户端/服务端通信 查询缓存 查询优化处理 查询执行引擎 返回客户端 mysql 客户端/服务端通信 Mysql客户端与服务端的通信方式是" ...

最新文章

  1. java iris_利用K-Means聚类算法实现对iris.data.ulab
  2. Nagios监控Linux系统
  3. Jazzy 文档生成器使用
  4. 韩国研制出世界最薄光伏电池:厚度仅为人类头发直径百分之一
  5. 亚马逊云科技张文翊:引领企业可持续发展的绿色云端之旅
  6. 上市在即!华为Mate 20 X 5G版证件照公布:国行首款5G手机
  7. C++中用stringstream类进行数据类型的转换
  8. 练习4.1 根据后序和中序遍历输出先序遍历 (25 分)
  9. Illegal characters found in URL
  10. 推荐一个Oracle数据库学习的网站
  11. ESP8266串口转wifi/wifi转串口模块
  12. python 服务器后台运行
  13. 独家策划-----让“超女”和“好男”联姻
  14. 考研政治|马克思主义基本原理
  15. 中国农业大学计算机专业在陕西录取分数线,2017中国农业大学各省各专业录取分数线(8)...
  16. 忆黄霑(文/林青霞)
  17. 帕德逼近matlab算法,一种基于帕德逼近的通信误差函数逼近方法与流程
  18. Unity的gamma矫正、颜色空间及其转换的问题
  19. 456. 132 模式
  20. 故障分析 | 报错 ERROR 5270 -HY000-- object not in RECYCLE BIN 引发的几个思考

热门文章

  1. 服务器输入字符在客户端显示,管理 Unicode 服务器与非 Unicode 客户端之间的数据转换...
  2. 五分钟没有操作自动退出_智阅云自动阅读器app下载-智阅云自动阅读器app安卓版下载v1.0...
  3. python正则表达式排除字符_利用正则表达式排除特定字符串
  4. 【若依(ruoyi)】部门查询SQL
  5. 【Nginx】输出/返回 HelloWorld
  6. java super object,java学习记录笔记--继承,super,Object类
  7. 零拷贝和java NIO
  8. yjv是电缆还是电线_BVV属于电线还是电缆?
  9. java多数据源事务管理_Spring中实现多数据源事务管理 - CSDN博客
  10. influxdb无法实现关联表_双汇:从棘手的InfluxDB+Redis到TDengine