mysql in查询不要去重_MySQL 查询优化
使用索引
规则
全值匹配:查询的字段按照顺序在索引中都可以匹配到,
最佳左前缀法则:指的过滤条件要使用索引必须按照索引建立时的顺序依次满足 , 一旦跳过某个字段 , 索引后面的字段都无法被使用。
不在索引列上做计算:不在索引列上做任何操作(计算、函数、(自动 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 查询优化相关推荐
- mysql 联合查询后排序_MySQL的查询(联合查询,查询排序,正则表达式)
MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询(联合查询,查询排序,正则表达式) MySQL的查询 联合查询实例 -- 联合查询 SELECT * FROM user union ...
- mysql子查询过多慢_MySQL子查询慢现象的解决
当你在用explain工具查看sql语句的执行计划时,若select_type 字段中出现"DEPENDENT SUBQUERY"时,你要注意了,你已经掉入了mysql子查询慢的& ...
- mysql获取查询策略语句_MySQL数据库查询性能优化策略
优化查询 使用Explain语句分析查询语句 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句. 通过对查询语句的分析,可以了解查询语句的执行 ...
- mysql慢查询的使用_mysql慢查询使用详解
1 慢查询定义指mysql记录所有执行超过long_query_time参数设定的时间阈值的SQL语句.慢查询日志就是记录这些sql的日志. 2 开启慢查询日志 找到mysql配置文件my.cnf.在 ...
- mysql嵌套查询详解_MySQL嵌套查询实例详解
本文实例分析了MySQL嵌套查询.分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): ...
- mysql嵌套查询详解_MySQL嵌套查询实例详解_MySQL
本文实例分析了MySQL嵌套查询.分享给大家供大家参考,具体如下: MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQL User Manual): ...
- [技术]mysql 慢查询时间设置_Mysql 慢查询设置
-- 查询是否设置慢查询 show variables like 'slow_query%'; -- 慢查询时间 -- show variables like 'long_query_time'; ...
- mysql通配符查询字段名_mysql通配符如何查询字段
mysql通配符查询字段的方法:1.使用[%]表示任何字符出现任意次数,代码为[WHERE title like '%张三']:2.使用[_]表示单个字符,代码为[WHERE title like ' ...
- mysql通配符查询字段名_mysql通配符如何查询字段,
mysql通配符如何查询字段如何用MySQL通配符查询字段,mysql通配符查询字段的方法:1.用[%]表示任意字符出现任意次数,代码为[类似"%张三"的WHERE标题]:2.用[ ...
最新文章
- net-tools 要被 iproute2 取代了
- 熟悉常用的HBase操作,编写MapReduce作业
- linux中/bin和/sbin和/usr/bin和/usr/sbin
- 面向对象编程语言中的接口(Interface)
- 华三交换机路由器图标_弱电箱网口不够用,用华三8口千兆交换机搞定
- CSS深入浅出(三)
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
- python获取app信息的库_Python学习教程:另辟蹊径,appium抓取app应用数据了解一下...
- java基础_集合List与Set接口
- Sonar - 部署常见问题及解决方法
- 声明类对象加括号与声明指针对象加括号的问题
- Collections.sort new Compartor 用法
- echarts官网打不开。
- 视频格式怎么改为mp4?有什么好用的视频格式转换软件
- 禁忌搜索(Tabu Search)算法及matlab实现(非旅行商(TSP)例子)
- 关于蓝牙无线通信与AOA定位技术
- Sleep函数--使得程序暂停一段时间(单位毫秒)
- 《Python数据科学手册》—学习笔记
- 2022-01-19:青蛙过河。 一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。 给你石子的位置列
- 菏泽一中2021级高考成绩查询入口,2021年菏泽中考各学校录取分数线,历年菏泽中考分数线汇总...
热门文章
- 1.1 信息,数据,数据处理与数据管理
- python调用nastran_Python调用Ansys、Nastran
- 【面经】2020届斗鱼服务端SP面经
- 关于重装完系统以后引导出错导致电脑无法开机的问题(File:\EFI\Microsoft\Boot\BCD,Error code:0xc000000f)
- 自由人NFT:你为什么抢不到NFT数字藏品?
- 基于XML 的服装 EDI 标准在服装企业的运用]XX 服装企业运用的营销策略
- spring boot:从零开始搭建一个项目 - day8 实现jwtToken验证
- Anaconda报错ValueError: PyCapsule_GetPointer called with incorrect name
- 机器学习入门研究(五)-特征工程之特征提取
- 用计算机进行文本信息的加工处理,文本信息的加工教案