广告
返回顶部
首页 > 资讯 > 数据库 >怎么在MySQL中对查询进行优化
  • 577
分享到

怎么在MySQL中对查询进行优化

2023-06-08 00:06:29 577人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关怎么在MySQL中对查询进行优化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、创建索引规范在学习索引优化之前,需要对创建索引的规范有一定的了解,此

本篇文章给大家分享的是有关怎么在MySQL中对查询进行优化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

一、创建索引规范

在学习索引优化之前,需要对创建索引的规范有一定的了解,此规范来自于阿里巴巴开发手册。

主键索引:pk_column_column

唯一索引:uk_column_column

普通索引:idx_column_column

二、索引失效原因

创建索引需知道在什么情况下索引会失效,只有了解索引失效的原因,在创建索引时才不会出现一些已知错误。

1.带头大哥不能死

这局经典的语句就是涵盖创建索引时一定要符合最左侧原则。

例如表结构为 u_id,u_name,u_age,u_sex,u_phone,u_time

创建索引为 idx_user_name_age_sex

查询条件必须带上u_name这一列。

不在索引列上做任何操作

不在索引列上做任何计算、函数、自动或者手动的类型转换,否则会进行全表扫描。简而言之不要在索引列上做任何操作。

俩边类型不等

例如建立了索引idx_user_name,name字段类型为varchar

在查询时使用where name = kaka,这样的查询方式会直接造成索引失效。

正确的用法为where name = "kaka"

不适当的like查询会导致索引失效

创建索引为idx_user_name

执行语句为select * from user where name like "kaka%";可以命中索引。

执行语句为select name from user where name like "%kaka";可以使用到索引(仅在8.0以上版本)。

执行语句为select * from user where name like ''%kaka";会直接导致索引失效

范围条件之后的索引会失效

创建索引为idx_user_name_age_sex

执行语句select * from user where name = 'kaka' and age > 11 and sex = 1;

上面这条sql语句只会命中name和age索引,sex索引会失效。

复合索引失效需要查看key_len的长度即可。

总结:%在后边会命令索引,当使用了覆盖索引时任何查询方式都可命中索引。

以上就是咔咔关于索引失效会出现的原因总结,在很多文章中没有标注Mysql版本,所以你有可能会看到is null 、or索引会失效的结论。

三、SQL优化杀手锏之 Explain

在写完SQL语句之后必须要做的一件事情就是使用Explain进行SQL语句检测,看是否命中索引。

下图就是使用explain输出格式,接下来将会对输出格式进行简单的解释。

怎么在MySQL中对查询进行优化

id 这列就是查询的编号,如果查询语句中没有子查询或者联合查询这个标识就一直是1。

如存在子查询或者联合查询这个编号会自增。

select_type

最常见的类型就是SIMPLE和PRIMARY,此列知道就行了。

table

理解为表名即可

**type

此列是在优化SQL语句时最需要关注的列之一,此列显示了查询使用了何种类型。

以下排序从最优到最差。

  • system:表内只有一行数据

  • const:最多只会有一条记录匹配,常用于主键或者唯一索引为条件查询

  • eq_ref:当连接使用的索引为主键和唯一时会出现

  • ref:使用普通索引=或<=> 运算符进行比较将会出现

  • fulltext:使用全文索引

  • ref_or_null:跟ref类型类似,只是增加了null值的判断,实际用的不多。语句为where name = 'kaka' and name is null,name为普通索引。

  • index_merge:查询语句使用了俩个以上的索引,常见在使用and、or会出现,官方文档将此类型放在ref_or_null之后,但是在很多的情况下由于读取索引过多性能有可能还不如range

  • unique_subquery:用于where中的in查询,完全替换子查询,效率更高。语句为value IN (SELECT primary_key FROM single_table WHERE some_expr)

  • index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引

  • range:索引范围查询,常见于使用 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN()或者like等运算符的查询中。

  • index:索引全表扫描,把索引从头到尾扫一遍

  • all:全表扫描,性能最差。

possible_keys

此列显示的可能会使用到的索引

**key

优化器从possible_keys中命中的索引

key_len

查询用到的索引长度(字节数),key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。

ref

如果是使用的常数等值查询,这里会显示const。

如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段。

如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func。

**rows

这是mysql估算的需要扫描的行数(不是精确值)。

这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好。

filtered

此列表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数

**extra

在大多数情况下会出现以下几种情况。

  • Using index:使用了覆盖索引,查询列都为索引字段

  • Using where:使用了where语句

  • Using temporary :查询结果进行排序的时候使用了一张临时表

  • Using filesort :对数据使用一个外部的索引排序

  • Using index condition:使用了索引下推,关于索引下推可以查看咔咔之前文章MySQL索引一文

总结

以上就是关于Explain所有列的说明,在平时开发的过程中,一般只会关注type、key、rows、extra这四列。

  • type优化目标至少达到range级别,要求是ref级别,如果可以consts最好。

  • key是查询使用到的索引,如果此列为空,要么未建立索引,要么索引失效。

  • rows是这条SQL语句扫描的行数,越少越好。

  • extra:此列为扩展列,如果出现临时表、文件排序则需要优化。

四、SQL优化杀手锏之 慢查询

上文说到了可以直接使用explain来分析自己的SQL语句是否合理,接下来再聊一个点那就是慢查询。

查看慢查询是否打开

怎么在MySQL中对查询进行优化

查看是否记录没有使用索引的SQL语句

怎么在MySQL中对查询进行优化

开启慢查询、开启记录没有使用到索引的SQL语句

set global log_queries_not_using_idnexes='on';set global log_queries_not_using_indexes='on';

怎么在MySQL中对查询进行优化

查询以上俩个配置是否打开

怎么在MySQL中对查询进行优化

设置慢查询时间,这个时间由自己把控,一般1s即可 set globle long_query_time=1;

如果查看这个时间没有变,则关于客户端在重新连接一次即可。

怎么在MySQL中对查询进行优化

查看慢查询存储位置

怎么在MySQL中对查询进行优化

然后随便执行一条不执行索引的语句即可在这个日志中查看到此语句

怎么在MySQL中对查询进行优化

上图中一般需要主要观察的是Query_time、SQL语句内容。

以上就是关于如何使用慢查询来查看项目中出现问题的SQL语句。

五、优化大法

此处跟大家聊一些常用的SQL语句优化方案,以上的俩个工具要好好的利用,辅助我们进行打怪。

  • 禁止使用select *,需要什么字段查询什么字段

  • where字段设置索引

  • group by、order by字段设置索引

  • 舍弃offset,limit分页,使用延迟关联来实现分页(数据量不大时可不用)

  • 写分页时当count为0时,直接返回避免执行分页语句

  • 利用覆盖索引进行查询避免回表

  • 建立复合索引时区分度最高的放在最左侧

  • 统计数据行数只用count(*),别整的花里胡哨的

  • 关于in和exist,如果查询的俩个表大小一致则性能差别可忽略,如果子查询表大用exist,否则使用in

  • 查询一行数据时加上limit 1

  • 选择合理的数据类型,在满足条件下数据类型越小越好

  • 联合查询join最多三个表,并且需要join的字段数据类型保持一致

  • in操作能避免尽量避免,无法避免的情况下in元素控制在1000以内

  • 数据更新频繁,区分度不高的列不适合建立索引

  • explain中的type至少要达到range,要求为ref

  • 联合索引满足最左侧原则

以上就是怎么在MySQL中对查询进行优化,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在MySQL中对查询进行优化

本文链接: https://www.lsjlt.com/news/250673.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 怎么在MySQL中对查询进行优化
    本篇文章给大家分享的是有关怎么在MySQL中对查询进行优化,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、创建索引规范在学习索引优化之前,需要对创建索引的规范有一定的了解,此...
    99+
    2023-06-08
  • 如何在mysql中对查询进行优化
    本篇文章为大家展示了如何在mysql中对查询进行优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、优化方法(1)重新定义表的关联顺序(多张表关联查询时,并不一定按照SQL中指定的顺序进行,但有一...
    99+
    2023-06-15
  • Mysql中怎么进行优化器对子查询的处理
    本篇文章给大家分享的是有关Mysql中怎么进行优化器对子查询的处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。根据子查询的类型和位置不同,m...
    99+
    2022-10-18
  • 怎么在mysql中优化查询
    这篇文章给大家介绍怎么在mysql中优化查询,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1、减少请求的数据量。只回到必要的列:最好不要使用SELECT*语言。只返回必要的行:使用LIMIT语言限制返回的数据。缓存重复...
    99+
    2023-06-15
  • 怎么在MySQL中对Group by进行优化
    本篇文章为大家展示了怎么在MySQL中对Group by进行优化,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一个标准的 Group by 语句包含排序、分组、聚合函数,比如 s...
    99+
    2023-06-08
  • MySQL中怎么优化limit查询
    今天就跟大家聊聊有关MySQL中怎么优化limit查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  同样是取10条数据select&n...
    99+
    2022-10-18
  • 在MySQL中怎么进行大小写查询
    这篇文章主要介绍“在MySQL中怎么进行大小写查询”,在日常操作中,相信很多人在在MySQL中怎么进行大小写查询问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在MySQL中怎...
    99+
    2023-04-20
    mysql
  • 怎么对MySQL查询结果进行排序
    怎么对MySQL查询结果进行排序,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  MySQL查询结果如何排序  之前有一个功能...
    99+
    2022-10-18
  • MySQL中怎么优化查询分页
    这期内容当中小编将会给大家带来有关MySQL中怎么优化查询分页,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  MySQL查询分页怎么优化  如果你的数据量有几十万条,用...
    99+
    2022-10-18
  • MySQL中怎么优化查询性能
    MySQL中怎么优化查询性能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。WHERE条件字段使用函数假设我们有如下创建表的语句mysq...
    99+
    2022-10-18
  • MySQL中怎么优化分页查询
    今天就跟大家聊聊有关MySQL中怎么优化分页查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 分页查询方法:在MySQL中,分页查询一般...
    99+
    2022-10-18
  • MySQL中怎么优化查询语句
    这篇文章将为大家详细讲解有关MySQL中怎么优化查询语句,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  MySQL常用30种SQL查询语句优化方法  1、...
    99+
    2022-10-18
  • MySQL中Like模糊查询速度太慢该怎么进行优化
    这篇文章主要介绍MySQL中Like模糊查询速度太慢该怎么进行优化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!第一个思路建索引like %keyword 索引失效,使用全表扫描。like keyword% 索引有效...
    99+
    2023-06-22
  • MYSQL中怎样优化慢查询
    今天就跟大家聊聊有关MYSQL中怎样优化慢查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  MYSQL慢查询优化方法及优化原则:  1、日期大小...
    99+
    2022-10-18
  • MySQL中怎么优化SQL查询语句
    这期内容当中小编将会给大家带来有关MySQL中怎么优化SQL查询语句,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、应尽量避免在 where 子句中使用!=或...
    99+
    2022-10-18
  • MySQL中的查询优化器怎么用
    本篇内容主要讲解“MySQL中的查询优化器怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL中的查询优化器怎么用”吧!对于一个SQL语句,查询优化器...
    99+
    2022-10-19
  • mysql怎么查询慢查询,及杀死对应进
    要查询和处理慢查询,以及杀死对应的进程,可以按照以下步骤进行操作: 1】查询慢查询: 在 MySQL 中,可以通过设置 slow_query_log 参数来启用慢查询日志,并配置 long_query_time 参数设置查询执行时间的阈值。...
    99+
    2023-09-25
    mysql 数据库
  • 怎么在mysql中根据索引优化查询速度
    这篇文章将为大家详细讲解有关怎么在mysql中根据索引优化查询速度,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。(一)索引的作用索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索...
    99+
    2023-06-14
  • Mysql怎么对json数据进行查询及修改
    这篇文章主要介绍“Mysql怎么对json数据进行查询及修改”,在日常操作中,相信很多人在Mysql怎么对json数据进行查询及修改问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql怎么对json数据进...
    99+
    2023-07-02
  • MySQL怎么对表结构进行优化
    本篇内容介绍了“MySQL怎么对表结构进行优化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   由于My...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作