【发布时间】:2013-12-15 20:59:54
【问题描述】:
我在使用这个查询时遇到了一些问题,每次我使用它时,cpu 使用率都会从 5% 变为 67%-100%。
我正在通过 java 服务在 ubuntu 中运行 mysql 服务器,但即使我通过任何 mysql ide 执行查询,结果都是一样的。
我已经在网上进行了一些搜索,所以我发布了 mysql 的配置文件。我添加了一些属性,然后我在一些帖子中找到了,但我认为我只是让它变得更糟。
嗯,这是我的 my.cnf 文件:
[mysqld]
innodb_file_per_table=1
innodb_buffer_pool_size = 256M
wait_timeout = 1800
local-infile=0
open_files_limit=10192
query_cache_size=128M
join_buffer_size=128K
thread_cache_size=4
table_cache=64
key_buffer_size=128M
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 1336
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 0.0.0.0
key_buffer = 2014M
max_allowed_packet = 2014M
thread_stack = 512K
thread_cache_size = 1024
myisam-recover = BACKUP
max_connections = 200
query_cache_limit = 2048M
log_error = /var/log/mysql/error.log
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
[isamchk]
key_buffer = 16M
!includedir /etc/mysql/conf.d/
我正在使用这个查询:
select regPosition.deviceId, count(regPosition.speed), max(regPosition.speed) from regPosition where (TIMESTAMPDIFF(MINUTE, lastPositionTime,now()) <= '5') and regPosition.speed >= '10' group by regPosition.deviceId;
该表的类型是 Myisam,它有大约 2M 的注册表,并以 idPosition 作为索引。 这是创建表查询:
CREATE TABLE `regPosition` (
`idPosition` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id autoincremental.',
`deviceId` int(5) NOT NULL COMMENT 'Id numérico del equipo. Identificador único para cada vehículo.',
`lastPositionTime` datetime NOT NULL COMMENT 'Fecha/hora en que se registra la marca de posición (realizada por el dvr).',
`divisionew` varchar(2) DEFAULT NULL COMMENT 'Orientación Este u Oeste.',
`longitude` int(11) NOT NULL COMMENT 'longitud.',
`divisionns` varchar(2) DEFAULT NULL COMMENT 'Orientación Norte o Sur.',
`latitude` int(11) NOT NULL COMMENT 'Latitud.',
`direction` int(11) DEFAULT NULL COMMENT 'Dirección en que apunta el dispositivo.',
`gradeLon` varchar(100) DEFAULT NULL COMMENT 'Longitud transformada a grados (en decimal).',
`gradeLat` varchar(100) DEFAULT NULL COMMENT 'Latitud transformada a grados (en decimal).',
`speed` int(11) NOT NULL COMMENT 'Velocidad del vehículo. Registrada por el dvr',
PRIMARY KEY (`idPosition`),
KEY `index` (`idPosition`) USING HASH
) ENGINE=MyISAM AUTO_INCREMENT=6562682 DEFAULT CHARSET=latin1;
[编辑]
查询的目的是获取设备的id和比速度大于10的次数(这只是一个例子,可能更多)并得到数据库记录的最大速度。
这个想法是这样的:如果在 5 分钟内速度超过 60kmh 有 5 次,我需要知道设备的 ID、最大速度和超过速度限制的次数。
如果你能给我任何帮助,我会很高兴:)。
感谢您的帮助。
【问题讨论】:
-
发布查询说明
-
对计算值执行具有
WHERE的查询几乎可以保证会导致表扫描,如果您有大量数据,这将是一个坏消息。 -
那么,在这种情况下我该怎么办?我无法修改表结构,我需要每 5 分钟或更短时间检查一次,以发出警报,告知速度限制突破。
-
@JuanEnriqueRiquelme 你说你不能修改表结构。但是你能在表中添加另一个索引吗?
lastPositionTime上的索引应该使您的WHERE子句更快。此外,如果您在另一个程序中执行此操作,那么您可以跟踪每次迭代中表中存在的最大idPosition,然后将AND idPosition > {previousMaxIdPosition}添加到您的查询中。 -
不错的一个@dg99 我要试试那个,我会告诉你怎么样。
标签: mysql ubuntu cpu-usage myisam