搜尋
首頁資料庫mysql教程MySQL SQL优化笔记的实际操作流程

以下的文章主要讲述的是MySQL SQL优化的实际应用笔记的实际操作流程,以及关于Mysql查询使用 index 的问题解决, 如果你对其相关的实际操作有兴趣的话,你就可以对以下的文章点击观看了。 Mysql的强制索引(Force Index)都为我们做了哪些优化? mysql5下大

以下的文章主要讲述的是 MySQL SQL优化的实际应用笔记的实际操作流程,以及关于Mysql查询使用 index 的问题解决, 如果你对其相关的实际操作有兴趣的话,你就可以对以下的文章点击观看了。

Mysql的强制索引(Force Index)都为我们做了哪些优化?

mysql5下大数据量查询优化的问题

推荐圈子: Database圈子

更多相关推荐 一般使用SQL的时候你是不会去想到优化。但是面对一个有MySQL SQL性能问题的数据库时,我们应该如何入手进行系统的分析,使得能够尽快定位问题SQL,并且尽快解决问题。

1.使用show status 命令了解各种MySQL SQL的执行频率

引用

例如在Mysql的Cline上输入

show status like 'Com_%';

显示的是一些:Com_xxx.

Com_xxx 表示每个xx语句执行的次数。通常情况下我们比较关注如下一些操作:

引用

Com_select:执行select操作的次数

Com_insert:执行Insert操作的次数,对于批量插入的INSERT操作,只累加一次

Com_update:执行update操作的次数

Com_delete:执行Delete操作的次数

上面这些参数对于所有存储引擎的表操作都会进行累加。下面有些参数只针对InnoDB存储引擎的,累加的算法也有点不一样。

引用

Innodb_rows_read:select查询返回的行数

Innodb_rows_inserted:执行INSERT操作插入的行数

Innodb_rows_updated:执行Update操作更新的行数

Innodb_rows_deleted:执行Delete操作删除的行数

通过上面的一些参数,我们可以了解当前数据库的应用是以插入为主还是以查询为主。以及各种类型的MySQL SQL大致的执行比例是多少。对于更新操作的计数,是对执行次数的计数,不管提交还是回滚都会进行累加。

对于事务型的应用,通过Com_commit和Com_rollback进行分析。如果回滚操作非常频繁那么要思考下是不是编写存在问题。

下面有几个参数用于了解数据库的基本情况

引用

Connections:试图连接Mysql服务器的次数(执行的命令是:show status like 'Con_%';)

Uptime: 服务器工作时间(执行的命令是:show status like 'Up_%';)

Slow_queries:慢查询的次数(执行的命令是:show status like 'Slow_%';)

2. 定位执行效率较低的MySQL SQL语句

要想定义效率较低的SQL可以按照下面两种方式试试。

引用

1. 通过慢查询日志定位那些执行效率较低的SQL语句,用 --log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件。

2. 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候进行查询慢查询日志并不能定位问题,可以使show processlist 命令查看当前MySQL在进行的线程,包括线程的状态,是否锁表等,可以实时地查看SQL的执行情况,同时对一些锁表操作进优化。

3. 使用EXPLAIN分析低效SQL的执行计划。

在查询到效率低的MySQLSQL语句后,那我们可以使用explain或者DESC命令获取Myswl如何执行SELECT语句的信息,包括在Select语句执行过程中表如何连接和连接的顺序。

例如你想计数xxxx年公司的销售额,那么需要操作sales和comapny table,并对money字段进行sum操作。看看怎么使用explain:

引用

explain select sum(moneys) from sales a company b where a.company_id = b.id and a.year=XXXX \G;(注意加上\G是为了更好的看)

显示如下:

<ol class="dp-xml">
<li class="alt"><span><span>*********************** 1. row***************************   </span></span></li>
<li><span>id: 1   </span></li>
<li class="alt"><span>select_type: SIMPLE   </span></li>
<li><span>table: a   </span></li>
<li class="alt"><span>type: ALL   </span></li>
<li><span>possible_keys: NULL   </span></li>
<li class="alt"><span>key:NULL   </span></li>
<li><span>key_len: NULL   </span></li>
<li class="alt"><span>ref: NULL   </span></li>
<li><span>rows:1000   </span></li>
<li class="alt"><span>Extra: Using where   </span></li>
<li><span>*********************** 2. row***************************   </span></li>
<li class="alt"><span>id: 2   </span></li>
<li><span>select_type: SIMPLE   </span></li>
<li class="alt"><span>table: b   </span></li>
<li><span>type: ref   </span></li>
<li class="alt"><span>possible_keys: ind_company_id   </span></li>
<li><span>key:ind_comapany_id   </span></li>
<li class="alt"><span>key_len: 5   </span></li>
<li><span>ref: sakila.a.company_id   </span></li>
<li class="alt"><span>rows:1   </span></li>
<li><span>Extra: Using where;Using index  </span></li>
</ol>

下面解释下每个列的含义:

引用

select_type: 表示SELECT的类型,常见的取值为SIMPLE(简单表,不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION、SUBQUERY

table: 输出结果集的表

type: 表示表的连接类型,性能由好到差的类型类型为

(System(表中仅有一行,即常量表),

const(单表中最多有一个匹配行),

eq_ref(对于前面的每一行,在此表中只查询一条记录),

ref(使用普通的索引),

ref_or_null(和ref类似,但是条件中包含对于NULL查询),

index_merge(索引合并优化),

unique_subquery(in的后面是一个查询主键字段的子查询),

index_subquery(类似unique_subquery,主要是in的后面是查询非唯一索引字段的子查询),

range(单表中的范围查询),

index(对于当前的每一行,都通过查询索引来得到数据),

all(对于当前的每一行,都通过全表扫描来得到数据))

possible_keys: 表示查询时,可能使用的索引

key:表示实际使用的索引

key_len:索引字段的长度

rows:扫描行的数量

Extra:执行情况的说明和描述

以上的相关内容就是对MySQL SQL优化的笔记的介绍,望你能有所收获。 


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!