使用索引

规则

全值匹配:查询的字段按照顺序在索引中都可以匹配到,

最佳左前缀法则:指的过滤条件要使用索引必须按照索引建立时的顺序依次满足 , 一旦跳过某个字段 , 索引后面的字段都无法被使用。

不在索引列上做计算:不在索引列上做任何操作(计算、函数、(自动 or 手动)类型转换「尤其注意 varchar 和 int」),会导致索引失效而转向全表扫描。

索引列上不能有范围查询:将可能做范围查询的字段的索引顺序放在最后

尽量使用覆盖索引:查询列和索引列一致,不写 select *;

不使用不等于(!=以及 <>)

当字段允许为 NULL 时:where 后条件 is null 可以使用索引,is not null 不可以用到索引

Like 以通配符(%sadfj%)开头时,MySQL 索引失效。解决办法:①可以使用主键索引;②使用覆盖索引,查询字段必须是建立覆盖索引字段;③当覆盖索引指向的字段是 varchar(380) 及 380 以上的字段时,覆盖索引会失效!

字符串不加单引号索引失效

少用 or,用了索引会失效

示例

助记口诀

全职匹配我最爱,最左前缀要遵守;

带头大哥不能死,中间兄弟不能断;

索引列上少计算,范围之后全失效;

LIKE 百分写最右,覆盖索引不写*;

不等空值还有 OR,索引失效要注意;

VAR 引号不可丢,SQL 优化有诀窍。

具体方案

关联查询优化

LEFT JOIN:左侧为驱动表,右侧为被驱动表

INNER JOIN:MySQL 会自动将小结果的表作为驱动表

straight_join:效果和 inner join 一样,但是会强制将左侧作为驱动表!

子查询尽量不要放在被驱动表,有可能使用不到索引,会生成临时表。

在优化关联查询时,在被驱动表建立索引才有效。

排序优化

在索引列上

ORDER BY 语句使用索引最左前列

使用 WHERE 子句与 ORDER BY 子句条件列组合满足索引最左前列

ORDER BY 后字段同时使用升序或降序

如果 WHERE 使用索引的最左前缀为常量,则 OEDER BY 可以使用索引

不在索引列上

双路排序:字面意思就是两次扫描磁盘,最终得到数据,读取行指针和orderby列,对他们进行排序,然后扫描已经排序好的列表,按照列表中的值重新从列表中读取对应的数据输出。

单路排序:从磁盘读取查询需要的所有列,按照order by列在buffer对它们进行排序,然后扫描排序后的列表进行输出,它的效率更快一些,避免了第二次读取数据。并且把随机IO变成了顺序IO,但是它会使用更多的空间,因为它把每一行都保存在内存中了。效率高

单路容易出现的问题:如果取出的数据总大小超过了 sort_buffer 的容量,导致每次只能取sort_buffer容量大小的数据,进行排序(创建tmp文件,多路合并),排完再取取sort_buffer容量大小,再排……从而多次I/O。

优化策略

① 增大 sort_buffer_size参数的设置(单路排序的内存大小)

② 增大 max_length_for_sort_data参数的设置(单次排序字段大小)

③ 去掉select 后面不需要的字段

分组优化

同 排序优化

实质是先排序后分组,遵循索引最左前缀

当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置

WHERE 效率高于 HAVING

子查询优化

有索引:inner join 是最好的,其次是 in,exists 最糟糕

无索引:反之(待验证)

分页优化

优化前:EXPLAIN SELECT SQL_NO_CACHE * FROM emp ORDER BY deptno LIMIT 10000,40;会出现 using filesort

加索引后没效果:

优化后:EXPLAIN SELECT SQL_NO_CACHE * FROM emp INNER JOIN (SELECT id FROM emp e ORDER BY deptno LIMIT 10000,40) a ON a.id=emp.id

优化思路: 先利用覆盖索引把要取的数据行的主键取到,然后再用这个主键列与数据表做关联(查询的数据量小了后再进行查询)。

去重查询

尽量不要使用 distinct 关键字去重,可以使用 group by+需要去重的字段,这个时候会用到索引

对于 IN 和 EXISTS 的使用

直接说个结论吧:EXISTS 后接大表,IN 后接小表,两表大小无差别两者都行

关联阅读

MySQL Explain 使用,看这一篇就够了

MySQL 查询语句执行过程

数据库优化指南

MySQL 索引入门

mysql in查询不要去重_MySQL 查询优化相关推荐

  1. mysql 联合查询后排序_MySQL的查询(联合查询,查询排序,正则表达式)

    MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询 联合查询实例 -- 联合查询 SELECT * FROM user union ...

  2. mysql子查询过多慢_MySQL子查询慢现象的解决

    当你在用explain工具查看sql语句的执行计划时,若select_type 字段中出现"DEPENDENT SUBQUERY"时,你要注意了,你已经掉入了mysql子查询慢的& ...

  3. mysql获取查询策略语句_MySQL数据库查询性能优化策略

    优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...

  4. mysql慢查询的使用_mysql慢查询使用详解

    1 慢查询定义指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句.慢查询日志就是记录这些sql的日志. 2 开启慢查询日志 找到mysql配置文件my.cnf.在 ...

  5. mysql嵌套查询详解_MySQL嵌套查询实例详解

    本文实例分析了MySQL嵌套查询.分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): ...

  6. mysql嵌套查询详解_MySQL嵌套查询实例详解_MySQL

    本文实例分析了MySQL嵌套查询.分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): ...

  7. [技术]mysql 慢查询时间设置_Mysql 慢查询设置

    -- 查询是否设置慢查询 show variables like 'slow_query%'; -- 慢查询时间  -- show variables like 'long_query_time'; ...

  8. mysql通配符查询字段名_mysql通配符如何查询字段

    mysql通配符查询字段的方法:1.使用[%]表示任何字符出现任意次数,代码为[WHERE title like '%张三']:2.使用[_]表示单个字符,代码为[WHERE title like ' ...

  9. mysql通配符查询字段名_mysql通配符如何查询字段,

    mysql通配符如何查询字段如何用MySQL通配符查询字段,mysql通配符查询字段的方法:1.用[%]表示任意字符出现任意次数,代码为[类似"%张三"的WHERE标题]:2.用[ ...

最新文章

  1. net-tools 要被 iproute2 取代了
  2. 熟悉常用的HBase操作,编写MapReduce作业
  3. linux中/bin和/sbin和/usr/bin和/usr/sbin
  4. 面向对象编程语言中的接口(Interface)
  5. 华三交换机路由器图标_弱电箱网口不够用,用华三8口千兆交换机搞定
  6. CSS深入浅出(三)
  7. Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
  8. python获取app信息的库_Python学习教程:另辟蹊径,appium抓取app应用数据了解一下...
  9. java基础_集合List与Set接口
  10. Sonar - 部署常见问题及解决方法
  11. 声明类对象加括号与声明指针对象加括号的问题
  12. Collections.sort new Compartor 用法
  13. echarts官网打不开。
  14. 视频格式怎么改为mp4?有什么好用的视频格式转换软件
  15. 禁忌搜索(Tabu Search)算法及matlab实现(非旅行商(TSP)例子)
  16. 关于蓝牙无线通信与AOA定位技术
  17. Sleep函数--使得程序暂停一段时间(单位毫秒)
  18. 《Python数据科学手册》—学习笔记
  19. 2022-01-19:青蛙过河。 一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。 给你石子的位置列
  20. 菏泽一中2021级高考成绩查询入口,2021年菏泽中考各学校录取分数线,历年菏泽中考分数线汇总...

热门文章

  1. 1.1 信息,数据,数据处理与数据管理
  2. python调用nastran_Python调用Ansys、Nastran
  3. 【面经】2020届斗鱼服务端SP面经
  4. 关于重装完系统以后引导出错导致电脑无法开机的问题(File:\EFI\Microsoft\Boot\BCD,Error code:0xc000000f)
  5. 自由人NFT:你为什么抢不到NFT数字藏品?
  6. 基于XML 的服装 EDI 标准在服装企业的运用]XX 服装企业运用的营销策略
  7. spring boot:从零开始搭建一个项目 - day8 实现jwtToken验证
  8. Anaconda报错ValueError: PyCapsule_GetPointer called with incorrect name
  9. 机器学习入门研究(五)-特征工程之特征提取
  10. 用计算机进行文本信息的加工处理,文本信息的加工教案