问题 - 当我查看mysql-slowquery.log时,我发现查询具有高query_time,即使一个查询有行检查= 1.此日志是人口密集的数据库。来自php网站。你能解释一下它们的原因和原因(如果有任何关于查询的想法)?
Query type 1 :
# Query_time: 0.198267 Lock_time: 0.000121 Rows_sent: 1 Rows_examined: 10636
use mysql;
SET timestamp=1490832000;
SELECT count(name) FROM information_schema.innodb_sys_tables
WHERE name like '%/#sql-%';
Query type 2:
# Query_time: 0.007362 Lock_time: 0.000127 Rows_sent: 0 Rows_examined: 1
use mysql;
SET timestamp=1490835900;
SELECT count(*) from mysql.rds_history
WHERE action = 'disable set master'
GROUP BY action_timestamp, called_by_user, action, mysql_version ,master_host,
master_port, master_user, master_log_file , master_log_pos,
master_ssl
ORDER BY action_timestamp LIMIT 1;
答案 0 :(得分:0)
是的,它返回1行,但也检查了行数Rows_examined: 10636
。此外,如果执行SELECT
时可能需要很长时间,由于任何DML操作,表上存在exclusive
或write
锁。在这种情况下SELECT
必须等到锁被释放(考虑到事务隔离级别为READ COMMITED
)
答案 1 :(得分:0)
查询类型1:
information_schema
不是真正的表格。相反,它是对各种内存结构的看法。其中一些结构是对需要计算甚至从磁盘中提取的内容的视图。所以......有些IS查询速度很快,有些则出乎意料地慢。
在你的情况下,它必须接触10K的东西,这需要花费时间,显然是198ms。这是合理的。
查询看起来像是计算ALTER TABLE
之类的tmp表的数量。 (我不能想为什么它有用。)
(注意:我的回答不同意Rahul的说法。)
查询类型2:
这花费了7毫秒,显然在一张桌子上进行了一次探测,最多只有一行。它似乎已经完成了表扫描,但没有找到action
。这是一个合理的'多少时间。毕竟,它必须在本次会议中第一次找到并打开表格,并阅读它发现的任何内容。
然而,查询很奇怪。它有一个COUNT(*)
和一个GROUP BY
,但它没有列出SELECT
中的分组内容。如果有有用的数据,它将返回一组数字(计数),但不知道每个计数所指的是什么。
附录 - 来自亚马逊:
类型1用于识别InnoDB字典中的剩余临时表,在发生崩溃的ALTER时用作诊断辅助。
类型2是对实例上启用的功能的内部检查。
为了解决这些影响,我们需要知道这些查询的频率,无论是RDS还是Aurora,log_queries_not_using_indexes
的设置,以及客户端和服务器之间的距离(毫秒延迟)。