首页 > 编程知识 正文

oracle查询慢解决办法,sql语句慢查询

时间:2023-05-05 17:53:40 阅读:26681 作者:2107

相反,MySQL数据库有几个配置选项,有助于及时捕获低效的SQL语句

1,slow_query_log

如果将此参数设置为ON,则可以捕获执行时间超过一定值的SQL语句。

2,long_query_time

如果SQL语句的执行时间超过此值,则会记录日志。 建议设定为1以下。

3,slow_query_log_file

记录日志的文件名。

4,log_queries_not_using_indexes

如果将此参数设置为ON,则可以检索所有未使用索引的SQL语句,但SQL语句可能执行得非常快。

二、如何检测mysql中sql语句的效率

1、查询日志

(1)、在Windows上打开MySQL滚动查询

MySQL在Windows系统上的配置式通常由my.ini在[mysqld]下

代码如下

log-slow-queries=f :/MySQL/log/mysqlowquery。 罗格

long_query_time=2

) 2、在Linux上启用MySQL滚动查询

在Linux系统上的MySQL配置文件通常是my.cnf在[mysqld]下

代码如下

log-slow-queries=/data/MySQL data/slow query。 罗格

long_query_time=2

说明

log-slow-queries=f :/MySQL/log/mysqlowquery。

由于存储滚动查询日志的位置,因此此目录通常需要MySQL执行帐户的可写权限。 此目录通常设置为MySQL的数据存储目录。

long_query_time=2的2表示查询超过2秒钟后进行记录。

2 .显示进程列表命令

SHOW PROCESSLIST显示正在运行的线程。 也可以使用mysqladmin processlist语句获取此信息。

每列的含义和用途:

ID列

在kill一个标记、一个语句时很有用。 用命令杀死此查询/*/mysqladmin kill进程号。

用户列

如果显示单个原始用户,而不是根用户,则此命令只显示您权限范围内的sql语句。

主机列

显示此语句是从哪个ip的哪个端口发出的。 跟踪问句的用户。

数据库列

显示此进程当前连接的数据库。

命令列

指示当前连接的执行的命令通常是休眠、查询、连接。

时间列

这种状态持续的时间,单位为秒。

状态列

显示使用当前连接的sql语句的状态。 重要列后跟所有状态的说明。 请注意,state只是语句正在执行的一个状态,一个sql语句。 以查询为例,可能需要经过copying to tmp table、Sorting result、Sending data等状态才能完成

info列

显示此sql语句。 由于长度有限,长sql语句显示不完整,但判断问题语句的重要依据之一。

此命令中最重要的是state列,mysql中列出的状态主要有:

检查表

正在检查数据表(这是自动的)。

关闭表

将表中的更改数据刷新到磁盘,并关闭已使用的表。 这是非常迅速的操作。 否则,必须检查磁盘空间是否已满,或者磁盘是否不堪重负。

连接输出

复制从服务器已连接到主服务器。

复制到tmp table on disk

由于临时结果集大于tmp_table_size,因此正在将临时表从内存存储转换为磁盘存储以节省内存。

创建tmp表

正在创建包含部分查询结果的临时表。

deleting from main table

服务器正在执行多表删除的第一部分。 我刚删除了第一张表。

来自定义参考表

服务器正在执行多表删除的第二部分,正在删除其他表中的记录。

流体表

正在运行FLUSH TABLES,等待其他线程关闭数据表。

杀手乐队

向一个线程发送技能请求时,该线程将检查技能标志位并放弃下一个技能请求。 MySQL在每次主循环中检查kill标志位,但在某些情况下,线程可能会稍微过多而死亡。 如果线程被其他线程锁定,kill请求将在解除锁定后立即生效。

LL

ocked

被其他查询锁住了。

Sending data

正在处理SELECT查询的记录,同时正在把结果发送给客户端。

Sorting for group

正在为GROUP BY做排序。

Sorting for order

正在为ORDER BY做排序。

Opening tables

这个过程应该会很快,除非受到其他因素的干扰。例如,在执ALTER TABLE或LOCK TABLE语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。

Removing duplicates

正在执行一个SELECT DISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。

Reopen table

获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。

Repair by sorting

修复指令正在排序以创建索引。

Repair with keycache

修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些。

Searching rows for update

正在讲符合条件的记录找出来以备更新。它必须在UPDATE要修改相关的记录之前就完成了。

Sleeping

正在等待客户端发送新请求.

System lock

正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。

Upgrading lock

INSERT DELAYED正在尝试取得一个锁表以插入新记录。

Updating

正在搜索匹配的记录,并且修改它们。

User Lock

正在等待GET_LOCK()。

Waiting for tables

该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。

waiting for handler insert

INSERT DELAYED已经处理完了所有待处理的插入操作,正在等待新的请求。

大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。

还有其他的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着。

例如如图:

3、explain来了解SQL执行的状态

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上explain就可以了:

例如:

explain select surname,first_name form a,b where a.id=b.id

结果如图

EXPLAIN列的解释

table

显示这一行的数据是关于哪张表的

type

这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys

显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key

实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句 中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len

使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref

显示索引的哪一列被使用了,如果可能的话,是一个常数

rows

MYSQL认为必须检查的用来返回请求数据的行数

Extra

关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

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上

Where used

使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)

const

表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待

eq_ref

在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

ref

这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好

range

这个连接类型使用索引返回一个范围中的行,比如使用>或

index

这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)

ALL

这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。