-%3erow mysql_MySQL查询优化

# MySQL查询优化

* [请简述项目中优化MySQL语句执行效率的方法,从哪些方面入手,SQL语句性能如何分析?](https://www.kancloud.cn/ranjun940726/php_interview/596348#MySQLSQL_3)

* [分析查询速度](https://www.kancloud.cn/ranjun940726/php_interview/596348#_5)

* [优化查询过程中的数据访问](https://www.kancloud.cn/ranjun940726/php_interview/596348#_74)

* [优化长难的查询语句](https://www.kancloud.cn/ranjun940726/php_interview/596348#_93)

* [优化特定类型的查询语句](https://www.kancloud.cn/ranjun940726/php_interview/596348#_106)

* [优化`count()`查询](https://www.kancloud.cn/ranjun940726/php_interview/596348#count_108)

* [优化关联查询](https://www.kancloud.cn/ranjun940726/php_interview/596348#_118)

* [优化子查询](https://www.kancloud.cn/ranjun940726/php_interview/596348#_124)

* [优化`group by`和`distinct`](https://www.kancloud.cn/ranjun940726/php_interview/596348#group_bydistinct_127)

* [优化`limit`子句](https://www.kancloud.cn/ranjun940726/php_interview/596348#limit_134)

* [优化`union`](https://www.kancloud.cn/ranjun940726/php_interview/596348#union_142)

# 请简述项目中优化MySQL语句执行效率的方法,从哪些方面入手,SQL语句性能如何分析?

# 分析查询速度

* 记录慢查询日志

分析查询日志,使用`pt-query-digest`工具进行分析

* 使用`show profile`

set profiling=1; # 服务器上执行的所有语句会检测消耗的时间、存到临时表中

`show profiles # 所有的SQL语句执行记录`

`show profile for query 临时表ID # 查执行ID的SQL语句`

~~~

mysql> set profiling=1;

Query OK, 0 rows affected

mysql> select * from user;

+----+------+-----+

| id | name | age |

+----+------+-----+

| 1 | Jack | 23 |

+----+------+-----+

1 row in set

mysql> show profiles;

+----------+------------+---------------------------------------------------------------------------------------------------------------------------------+

| Query_ID | Duration | Query |

+----------+------------+---------------------------------------------------------------------------------------------------------------------------------+

| 1 | 8.675E-5 | set profiling=1 |

| 2| 0.000197 | select * from user |

+----------+------------+---------------------------------------------------------------------------------------------------------------------------------+

10 rows in set

mysql> show profile for query 2;

+----------------------+----------+

| Status | Duration |

+----------------------+----------+

| starting | 4.3E-5 |

| checking permissions | 7E-6 |

| Opening tables | 1.8E-5 |

| System lock | 1E-5 |

| init | 1.4E-5 |

| optimizing | 4E-6 |

| statistics | 3.1E-5 |

| preparing | 1E-5 |

| executing | 2E-6 |

| Sending data | 1E-5 |

| end | 3E-6 |

| query end | 2E-6 |

| closing tables | 5E-6 |

| freeing items | 3.5E-5 |

| logging slow query | 3E-6 |

| cleaning up | 2E-6 |

+----------------------+----------+

16 rows in set

~~~

* show status

`show status`会返回一些计数器,`show global status`查看服务器级别的所有计数。

* show processlist

观察是否有大量的线程处于不正常的状态或特征。

* explain

分析单条的SQL语句

~~~

mysql> explain select * from user;

+----+-------------+-------+--------+---------------+------+---------+------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+--------+---------------+------+---------+------+------+-------+

| 1 | SIMPLE | user | system | NULL | NULL | NULL | NULL | 1 | |

+----+-------------+-------+--------+---------------+------+---------+------+------+-------+

1 row in set

~~~

> explain它有一个别名`desc`,所以使用`desc select * from user;`查询到的结果与上面的一样。

# 优化查询过程中的数据访问

* 数据太多会导致查询性能下降。

* 确定应用程序是否在检索大量超过需要的数据,可能太多行或列。

* 确认MySQL服务器是否在分析大量不必要的数据行

**避免使用以下SQL语句**

* 查询不需要的记录,使用`limit`解决

* 多表管理返回全部列,需要制定列,[如A.id](http://xn--a-ch1b.id/)、B.name等

* 总是取出全部列,`select *`会让优化器无法完成索引覆盖扫描优化

* 重复查询相同的数据,可以使用缓存,下次直接读取缓存

**是否在扫描额外的记录**

使用`explain`来进行分析,如果发现查询需要扫描大量的数据但是只返回少数的行,可以通过如下技巧去优化:

* 使用索引覆盖扫描,把所有的列都放在索引中。

* 改变数据库和表的结构,修改数据表范式

* 重写SQL语句,让优化器可以以最优的方式执行查询

# 优化长难的查询语句

使用尽可能小的查询是好的,但有时将一个大的查询分解成多个小的查询是很有必要的。

* **切分查询**

将一个大的查询分为多个小的相同的查询

一次性删除1000万的数据比一次删除1万,暂停一会儿在执行删除1万条数据要较少更多的服务器开销。

* **分解关联查询**

可以将一条关联语句分解成多个SQL语句执行

让缓存的效率更高

执行单个查询可以减少锁的竞争

在应用层做关联可以更容易对数据库进行拆分

# 优化特定类型的查询语句

## 优化`count()`查询

* `count(*)`占用的`*`会忽略所有的列,直接统计所有的列数,因此不要使用`count(列名)`

* MyISAM中`没有任何where条件的count(* )`查询速度非常快

* `有where条件`时,MyISAM的count统计不一定比其他表引擎快

优化:

* 可以使用`explain`查询近似值,用近似值代替`count(*)`

* 增加汇总表

* 使用缓存

## 优化关联查询

* 确定on或者using子句的列上有索引;

* 确保`group by`和`order by`中只有一个表中的列,这样MySQL才有可能使用索引;

## 优化子查询

尽量使用关联查询替代

## 优化`group by`和`distinct`

* 使用**索引**来优化

* 关联查询中,使用**标识列**(主键列)进行分组的效率会更高

* 如果不需要`order by`,进行`group by`时使用`order by NULL`,MySQL不会进行文件排序

* `with rollup`超级剧和,可以挪到应用程序处理

## 优化`limit`子句

`limit`偏移量大的时候,查询效率较低。

方案:

* 记录上一次查询的最大ID,下次查询时直接根据ID来查询(还是使用limit查询,不过加一个where条件,id > ID)

## 优化`union`

`union all`的效率高于`union`。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql5.6特性_MySQL5.6新版本特性

MySQL已发布新的系列版本5.6.x,如果打算升级的朋友可以尝试,虽然目前没有收到新版本的使用反馈,但凭借MySQL占据市场份额来看,新版本的确值得期待。五大特性:优化器的改进MySQL Optimizer 团队做了大量的工作为了不断的…

java计算整数出现的次数_[剑指offer题解][Java]1到n整数中1出现的次数

前言众所周知,《剑指offer》是一本“好书”。如果你是个算法菜鸡(和我一样),那么最推荐的是先把剑指offer的题目搞明白。对于剑指offer题解这个系列,我的写作思路是,对于看过文章的读者,能够做到…

mysql 更改root密码及 主机_设置更改root密码(远程,本地)、连接mysql、mysql常用命令...

设置更改root密码1、将mysql加入环境变量中[rootcentos7 ~]# grep mysql /etc/profileexport PATH/usr/local/mysql/bin/:$PATH2、直接登录,无密码[rootcentos7 ~]# mysql -uroot3、方式一:设置密码[rootcentos7 ~]# mysqladmin -uroot password 123456W…

从NetBeans运行和调试WildFly Swarm应用程序

使用NetBeans的Java EE开发人员习惯于直接在NetBeans所选择的应用程序服务器中运行和调试其瘦战应用程序。 在开发打包为ber或镂空jars的微服务时,您期望使用相同的轻松方式进行运行和调试。 好消息是您可以。 在本文中,我将逐步演示如何在NetBeans中运行…

hazelcast入门教程_Hazelcast入门

hazelcast入门教程7月,我写了一个博客向Java开发人员介绍erlang,重点介绍了这两种语言之间的一些异同。 erlang虚拟机具有许多令人印象深刻的内置功能,其中之一是它们独立于位置且可以相互通信。 这意味着可以通过编写很少的代码行在VM之间同…

[MEGA DEAL]完整的Java编程训练营(94%折扣)

成为Java Master的10门课程(83.5小时):使用JavaFX的设计UI,利用设计模式,Master Multithreading等 嘿,怪胎, 本周,在我们的JCG Deals商店中 ,我们提供了另一个超值优惠…

java重排序_Java内存模型FAQ(四)重排序意味着什么?

译者:Alex在很多情况下,访问一个程序变量(对象实例字段,类静态字段和数组元素)可能会使用不同的顺序执行,而不是程序语义所指定的顺序执行。编译器能够自由的以优化的名义去改变指令顺序。在特定的环境下,处理器可能会…

JVM体系结构101:了解您的虚拟机

Java虚拟机(JVM)架构和Java字节码101的初学者速成班 Java应用程序无处不在,它们在我们的手机,平板电脑和计算机上。 在许多编程语言中,这意味着要多次编译代码才能使其在不同的OS上运行。 对于作为开发人员的我们来说…

flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查

Flask-SQLAlchemy对数据库增删改查安装pip install flask-sqlalchemy具体不多说了,主要是对数据库进行简单的增删改查,上代码,看注释app.route(/)def index():#增加article1 Article(titletest1, contentthe first test)db.session.add(arti…

带有Jersey的JAX-RS教程,用于RESTful Web服务

在当今世界,数据扮演着非常重要的角色。 如此众多的应用程序将各种类型的数据用于不同的操作,所以最重要的方面是应用程序之间的通信。 当应用程序可以通信时,它们之间的数据共享变得容易。 就像在亚洲运行的应用程序向在欧洲运行的应用程序…

java swing 打开文件_java swing实现打开Excel文件并进行处理

这里选择Excel文件是业务需要,话不多说1、引入对Excel处理的相关依赖org.apache.poipoi3.16org.apache.poipoi-ooxml3.162、进行swing的相关布局代码:package com.mozarta;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.xssf.usermodel…

java的对象对象映射_Java对象到对象映射器

java的对象对象映射我在该项目上使用了Dozer一段时间。 但是,最近我遇到了一个非常有趣的错误,这促使我环顾四周,并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表: 推土机:推土机是Java Bean到Java Bea…

java parallelstream_关于Java8 parallelStream并发安全的深入讲解

背景Java8的stream接口极大地减少了for循环写法的复杂性,stream提供了map/reduce/collect等一系列聚合接口,还支持并发操作:parallelStream。在爬虫开发过程中,经常会遇到遍历一个很大的集合做重复的操作,这时候如果使…

使用Google Cloud Storage托管您的Maven工件

如果您使用Google Cloud并将Java用于项目,那么Google Cloud Storage是托管团队工件的理想场所。 它很容易设置,而且很便宜。 如果您对它们的功能不特别感兴趣,那么它比设置现有存储库选项(jfrog,nexus,arc…

java+map对象判断空值_java判断map中是否存在指定对象

Map判断是否包含指定的value使用containsValue方法。(推荐:java视频教程)定义containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true示例:/**** Map集合判断是否包含value**/public class MapDemo{public static vo…

excel查重复_毕业季 | 如何降低论文的查重率

毕业季吾日三省吾身实验做完了吗?论文写完了吗?查重能通过吗?学术圈的前辈告诉我们,只有站在巨人的肩膀上才能看得更远。在撰写一篇论文时,为保证质量和可靠性,难免需要引用前人的成果,这也反映…

Java,JavaFX的流畅设计风格进度栏

按照承诺,刚刚发布的Java JavaFX主题JMetro 4.6版为进度栏带来了新样式。 进度栏有两种可能的状态:确定和不确定,新的JMetro版本具有这两种状态。 在本文中,我还将详细介绍一些我在JMetro中遵守的API设计原则。 JMetro API设计原…

安卓最新系统_成纺移动校园(移动办公系统)V3.2.1 安卓最新版

成纺移动校园(移动办公系统)是额一个非常实用的办公工具。您可以使用该软件及时浏览最新的校园信息,同时涵盖许多功能,例如时间表查询,会议安排,校园地图,校车等。有需要的用户欢迎来绿色先锋网下载。 成纺移动校园简介…

pyqt 获取 UI 中组件_你想知道的React组件设计模式这里都有(上)

本文梳理了容器与展示组件、高阶组件、render props这三类React组件设计模式往期回顾:HBaseCon Asia 2019 Track 3 概要回顾随着 React 的发展,各种组件设计模式层出不穷。React 官方文档也有不少相关文章,但是组织稍显凌乱,本文就…

typora导出word指定样式_(二)最简洁的Markdowd编辑器:Typora

(提醒:前面都是介绍和语法,想下载了就能用的直接看最后总结)大家好,半瓶醋同学又来误人子弟了。现在办公文档或者邮件的处理,一般都是用微软的office word或者邮件自带的编辑器。但是用word或者邮件自带编辑…