У меня возникают проблемы с этим запросом, каждый раз, когда я его использую, загрузка процессора увеличивается с 5% до 67%-100%.
Я запускаю сервер mysql в ubuntu с помощью службы java, но даже если я выполняю запрос через любой ide mysql, результаты те же.
Я сделал некоторый поиск в Интернете по этому поводу, поэтому я публикую файл конфигурации 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, у нее около 2 МБ реестра и 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;
[РЕДАКТИРОВАТЬ]
Цель запроса - получить идентификатор устройства и количество раз, превышающее скорость, превышающую 10 (это просто пример, это может быть больше), и получить максимальную скорость, записанную базой данных.
Идея этого заключается в следующем: если скорость превышает 60 км/ч 5 раз за 5 минут, мне нужно знать идентификатор устройства, максимальную скорость и количество превышений ограничения скорости.
Если вы можете дать мне любую помощь, я был бы очень рад :).
Спасибо за помощь.
WHERE
к вычисляемым значениям практически гарантированно приведет к сканированию таблицы, и это плохая новость, если у вас много данных. - person tadman   schedule 29.11.2013lastPositionTime
должен сделать ваше предложениеWHERE
намного быстрее. Кроме того, если вы делаете это в другой программе, вы можете отслеживать максимальное количествоidPosition
, присутствующих в таблице на каждой итерации, а затем добавлятьAND idPosition > {previousMaxIdPosition}
к вашему запросу. - person dg99   schedule 29.11.2013WHERE
. ИспользуйтеWHERE lastPositionTime > #foo#
и замените #foo# в вашем языке сценариев (PHP, Java и т. д.) текущим временем меньше 5 минут (т. е. #foo# становится константой в этом запросе). - person AgRizzo   schedule 29.11.2013