思路:分析慢查询日志-查看表结构、表状态-查看表索引-分析sql语句-explain-修改sql语句-验证修改结果

打开慢查询日志

在my.cnf置文件中修改

log-slow-queries

打开慢查询日志

long_query_time

设一个阀值,要大于这个值才会记录,等于该值时不记录。

log_queries_not_using_indexes

如果运行的SQL语句没有使用索引,则MySQl数据库同样会将这条SQL语句记录到慢查询日志文件

也可以在MySQL中直接设置long_query_time的值

mysql> set long_query_time=2;

Query OK, 0 rows affected (0.02 sec)

mysql> show variables like 'long%';

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

| Variable_name   | Value |

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

| long_query_time | 2     |

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

1 row in set (0.00 sec)

查看慢查询日志

默认情况下,在数据库目录下,例如/var/lib/mysql,在数据库运行时,可动态观察

tail -f slowquery.log

……

# Time: 110523  9:58:35时间

# User@Host: grid[grid] @  [203.100.192.66]连接信息

# Query_time: 4  Lock_time: 0  Rows_sent: 1  Rows_examined: 4815

查询时间锁时间返回行数总共查询行数

select count(*) fromtable_namewhere……

利用mysqldumpslow分析慢查询日志

mysqldumpslow -s c -t 10 输出记录次数最多的10条SQL语句

mysqldumpslow -s r -t 10 返回记录集最多的10个查询

mysqldumpslow -s t -t 10 -g'left join'按照时间排序的前10条里面含有左连接的查询语句

-s, 是表示按照何种方式排序

c记录次数、t时间、l查询时间、r返回的记录数,ac、at、al、ar,表示相应的倒叙;

-t, 是top n的意思,即为返回前面多少条的数据;

-g, 后边可以写一个正则匹配模式,大小写不敏感的;

-s t按总query time排序-s at按平均query time排序

-s l按总locktime排序-s al按平均lock time排序

-s s按总row send排序-s as按平均row send排序

-s c按count排序注意:在默认情况下

mysqlslowdump的输出结果会使用N和S代替SQL中出现的数字和字符串

mysqlslowdump输出结果是按照count(SQL出现的次数)排序的

mysqldumpslow结果分析

# mysqldumpslow -s c -t 10 slowquery.log

Reading mysql slow query log from slowquery.log

Count: 147973  Time=4.64s (686449s)  Lock=0.34s (51032s)  Rows=1.0 (147687), grid[grid]@[203.100.192.66]

select count(*) fromtable_namewhere ((newsT = 'S' and…………用S代表字符串

平均执行147973次,每次耗时4.64秒

分析问题

show create tabletable_name查看表结构

分析问题查看当期表都有哪些索引

mysql> show index from t \G

*************************** 1. row ***************************

Table: t索引所在的表名

Non_unique: 0非唯一索引,0代表唯一,可以看到主键名字是PRIMARY,因此必须唯一。

Key_name: PRIMARY索引的名称,可以通过这个名称来DROP INDEX

Seq_in_index: 1索引中该列的位置(注意理解是“索引中”),参考联合索引就容易理解了。

Column_name: a索引的列

Collation: A列以什么方式存储在索引中,可以是A或者NULL。B+树索引总是A,即排序的。如果使用了heap存储引擎,并建立了hash索引,这里就会显示NULL。因为hash根据hash桶来存放数据,而不是对数据进行排序。

Cardinality: 5非常关键的值!!!表示索引中唯一值的数据的估计值。Cardinality值/表的行数,应尽可能接近1,如果非常小,那么考虑是否还需要这个索引???

Sub_part: NULL是否是列的部分被索引,如果是整个列,则该字段为NULL

Packed: NULL关键字如何被压缩,如果没有被压缩,则为NULL

Null:是否索引的列含有NULL值。

Index_type: BTREE索引的类型。

Comment: 注释

Index_comment:

Cardinality值(大概的值)非常关键,优化器会根据这个值来判断是否使用这个索引。但是这个值并不是实时更新的,并非每次索引的更新都会更新该值,因为代价太大。

更新索引的Cardinality信息

mysql> analyze table t \G

*************************** 1. row ***************************

Table: test.t

Op: analyze

Msg_type: status

Msg_text: OK

1 row in set (0.04 sec)

注意:不是每个系统上都得到同样的结果,目前(MySQL5.1),analyze table还存在一些问题。

建议:在非高峰时间,对应用程序下的几张核心表做analyze table操作,这能使优化器和索引更好的工作。

分析问题explain

mysql> explain select * from t where a=1 \G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: t

type: const

possible_keys: PRIMARY,idx_a_b

key: PRIMARY优化器实际使用的索引

key_len: 4

ref: const

rows: 1

Extra:

1 row in set (0.00 sec)

select_type:表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。

table:输出结果集的表。

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

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

const(单表中最多有一个匹配行,例如primary key或者unique index)、

eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用primary key或者unique index)、

ref(与eq_ref类似,区别在于不是使用primary key或者unique index,而是使用普通的索引)、

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:执行情况的说明和描述。

Distinct

一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

Not exists

MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行, 就不再搜索了

Range checked for each

Record(index map:#)

没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

Using filesort

看到这个的时候,查询就需要优化了。MySQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行

Using index

列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

Using temporary

看到这个的时候,查询需要优化了。这里,MySQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

Using where

使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题

分析问题查看表状态

mysql> show table status like 'table_name' \G

解决问题

修改sql语句,每次改动,都要explain测试一下。后续研究SQL语句优化。

参考:

源文档

源文档

源文档

源文档

oracle怎么查看慢查询日志,慢查询日志的分析过程相关推荐

  1. oracle怎么查看表的唯一约束,查询(看)表的主键、外键、唯一性约束和索引

    --查找表的所索引(包括索引名,类型,构成列: SELECT T.*, I.INDEX_TYPE FROM USER_IND_COLUMNS T, USER_INDEXES I WHERE T.IND ...

  2. 优化案例2:select标量子查询且主查询排序

    优化案例2:select标量子查询且主查询排序 1. 场景描述 2. 分析过程 2.1 查看原始SQL执行计划 2.2 ET定位耗时操作符 2.3 注释大法 3. 解决方法 3.1 HINT功法 3. ...

  3. oracle查询当前归档scn_【学习笔记】Oracle数据库 查看归档日志存放的位置

    [学习笔记]Oracle数据库 查看归档日志存放的位置 时间:2016-10-21 19:19   来源:Oracle研究中心   作者:HTZ   点击: 次 天萃荷净 分享一篇关于查看Oracle ...

  4. Linux系统查看oracle日志,Linux 查询oracle错误日志警告日志

    Java学习基础2 运算符: ++:  int a = 4;  int b = a++;    ++在后:先运算在递增1   输出:a=5  b=4;    int b = ++a;    ++在前: ...

  5. oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析

    oracle查看执行最慢与查询次数最多的sql语句 注:本文来源 于<oracle查看执行最慢与查询次数最多的sql语句> 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率 ...

  6. oracle查询列属性,Oracle中查看所有的表,列,属性,…

    在Oracle中查看所有的表: select * from tab/dba_tables/dba_objects/cat; 看用户建立的表 :  select table_name from user ...

  7. oracle一条sql运行时间很长,oracle查看执行最慢与查询次数最多的sql语句及其执行速度很慢的问题分析...

    oracle查看执行最慢与查询次数最多的sql语句 前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻 ...

  8. Oracle 数据库sql语句查看字符集,PG数据库查询字符集方法

    [Oracle 数据库查询字符集] 查询出 NLS_NCHAR_CHARACTERSET 参数的值即是数据库的字符集. select * from nls_database_parameters; [ ...

  9. oracle查看联机日志,oracle联机日志和归档日志

    联机日志文件又叫重做日志文件,记录了对数据库修改的信息,包括用户对数据修改和数据库管理员对数据库结构的修改,一个oracle实例有一组或多组联机日志,每组至少包含1个或者多个日志成员,这里要多个日志成 ...

  10. 体验一下Oracle 11g物理Active Data Guard实时查询(Real-time query)

    以下为[高可用] 课后一则实验日志: --------------------------------------------------------------------------------- ...

最新文章

  1. c语言字符串 s,c – printf格式字符串中“% – *.* s”的含义是什么
  2. 谁是AI行业最受关注的人?未来图灵发布《AI明星企业家热搜榜》
  3. 谷歌机器人业务重组 花里胡哨没有用 要做实干家
  4. 当科学遇上众包:9个值得关注的前沿科技算力众包平台
  5. Python 面向对象-如何查看类的父类,外部如何获取类的名字
  6. 数字电路是如何搭建的
  7. UVA - 540:Team Queue
  8. singer页左侧滚动的时候右侧跟随高亮显示
  9. 大工13秋 c/c++语言程序设计 在线作业3,大工19秋《JavaScript基础教程与应用》在线作业3【满分答案】...
  10. iptables常用配置规则
  11. 智能优化算法:材料生成优化算法-附代码
  12. html教图片程,html教的程大全.pdf
  13. SM2258XT数据恢复全解,慧荣SM2258XT主控数据恢复详细教程,SM2259XT可参考
  14. GPS定位开发步骤以及流程图
  15. SMC真空电磁阀气路接法
  16. python微信群管理开禁言_微信群主怎么禁言一个人?操作方法介绍!
  17. 程序员如何向领导提涨薪加薪
  18. Tackling Climate Change with Machine Learning
  19. java标识符命名规范之驼峰命名法
  20. Mac Word 公式自动编号与交叉引用

热门文章

  1. 矩阵分析(2)--正规矩阵、正交矩阵
  2. 安卓html 750px,移动端750px页面适配
  3. AT指令集及常用指令
  4. 基于android的校园二手交易平台的设计
  5. 3个月攻破CCNA:12周教程资料盘点
  6. 第二章 ARM体系结构与指令集——ARM
  7. CentOS 7各版本镜像合集下载
  8. java 记住密码的实现_javaweb实现记住密码功能
  9. Navicat中文版破解安装
  10. 强制停用华为桌面,换第三方桌面