MySQL奇怪的慢查询 [英] Strange slow queries with MySQL

查看:95
本文介绍了MySQL奇怪的慢查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个表 A ,其中包含IP范围(列startIpNum,endIpNum,locId)和表 A_location (列locaId和其他不重要的列).有以下索引-A上的startIpNum和endIpNum,A_location上的locId.

I have table A which contains IP ranges (columns startIpNum, endIpNum, locId) and table A_location (column locaId and other not important columns). There are following indexes - startIpNum and endIpNum on A, and locId on A_location.

问题在于,有时查询执行速度非常慢.下面是一个mysql-slow日志文件,其中包含两个查询,其中有些不返回任何内容.

The problem is that sometimes queries are performed very slowly. Below there is a mysql-slow logfile, which contains two queries, bith of them return nothing.

# Time: 140001 21:18:45    
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 0.023001  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1394367480;
SELECT * FROM A_location AS location, (SELECT * FROM A WHERE (3998482191 BETWEEN startIpNum AND endIpNum) ORDER BY startIpNum DESC LIMIT 1) AS blocks WHERE location.locId = blocks.locId;

# Time: 140309 21:18:45
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 54.893140  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0
SET timestamp=1394367525;
SELECT * FROM A_location AS location, (SELECT * FROM A WHERE (2463400155 BETWEEN startIpNum AND endIpNum) ORDER BY startIpNum DESC LIMIT 1) AS blocks WHERE location.locId = blocks.locId;

这种行为的原因可能是什么?

What could be the reason of such behaviour?

EXPLAIN结果:

EXPLAIN results:

更新: 问题解决了,最终查询

UPDATE: The question was solved, final query

ALTER TABLE A ORDER BY startIpNum ASC;
SELECT A_location.* FROM A_location AS location,
(SELECT A.* FROM A as blocks,
(SELECT * FROM A WHERE startIpNum < 24465138 ORDER BY startIpNum DESC LIMIT 1) AS startipnumquery
WHERE blocks.startIpNum = startipnumquery.startIpNum AND blocks.endIpNum > 24465138
ORDER BY blocks.endIpNum ASC LIMIT 1) as subresult
WHERE location.locId = subresult.locId;

推荐答案

您当前的查询已更新如下,请在查询下方运行并检查响应时间,我99.99%确信它将为您提供最佳结果

Your current query i have updated as below please run below query and check response time, i 99.99% sure it will giving to you best result

Step 1: ALTER TABLE A ORDER BY startIpNum DESC;


Step 2: SET timestamp=1394367480;
SELECT location.*, (SELECT * FROM A WHERE (3998482191 BETWEEN startIpNum AND endIpNum) LIMIT 1) AS blocks FROM A_location AS location, WHERE location.locId = blocks.locId;

Step 1: ALTER TABLE A ORDER BY startIpNum DESC;

Step 2: SET timestamp=1394367525;
SELECT location.*, (SELECT * FROM A WHERE (2463400155 BETWEEN startIpNum AND endIpNum) LIMIT 1) AS blocks FROM A_location AS location WHERE location.locId = blocks.locId;

我刚刚从查询中删除了 ORDER BY字段DESC ,并使用 ALTER TABLE A ORDER BY startIpNum DESC更改了表;

i have just remove ORDER BY field DESC from your query and table alter with ALTER TABLE A ORDER BY startIpNum DESC;

这篇关于MySQL奇怪的慢查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆