one part of the query that seems particually slow is:
SELECT
MAX(id) AS id, gps_unit_id
FROM
fms1
GROUP BY gps_unit_id
the results of this subquery get joined with all the units belonging to a relation. So I guess those two can be combined in one faster query.
I want to have the latest FMS message per unit belonging to a relation
CREATE TABLE IF NOT EXISTS `fms1` (
`id` int(10) unsigned NOT NULL auto_increment,
`gps_unit_id` int(10) unsigned NOT NULL,
`odometer` double default NULL,
`total_fuel` float default NULL,
`engine_hours` float default NULL,
`actual_speed` float default NULL,
`actual_engine_speed` float default NULL,
`actual_engine_torque` int(11) default NULL,
`kickdown_switch` tinyint(1) default NULL,
`accelerator_position` float default NULL,
`brake_switch` tinyint(1) default NULL,
`clutch_switch` tinyint(1) default NULL,
`cruise_active` tinyint(1) default NULL,
`pto_active` tinyint(1) default NULL,
`fuel_level` float default NULL,
`engine_temperature` int(11) default NULL,
`turbo_pressure` float default NULL,
`axle_weight_0` float default NULL,
`axle_weight_1` float default NULL,
`axle_weight_2` float default NULL,
`axle_weight_3` float default NULL,
`service_distance` int(11) default NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `gps_unit_id` (`gps_unit_id`),
KEY `created_gps_unit_id_idx` (`created`,`gps_unit_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2673414 ;
CREATE TABLE IF NOT EXISTS `gps_units` (
`id` int(10) unsigned NOT NULL auto_increment,
`relation_id` int(10) unsigned default NULL,
`session_id` int(10) unsigned default NULL,
`telephone` varchar(16) default NULL,
`numberplate` varchar(12) default NULL,
`country_id` int(10) unsigned default NULL,
`uid` varchar(64) default NULL,
`name` varchar(128) default NULL,
`descr` varchar(255) default NULL,
`brand` varchar(64) default NULL,
`model` varchar(64) default NULL,
`type` varchar(64) default NULL,
`version` varchar(64) default NULL,
`device_token` varchar(256) default NULL,
`icon_id` int(10) NOT NULL default '1',
`icon_type` tinyint(5) unsigned NOT NULL default '0',
`deleted` tinyint(1) NOT NULL default '0',
`created` datetime default NULL,
`modified` datetime default NULL,
PRIMARY KEY (`id`),
KEY `relation_id` (`relation_id`),
KEY `session_id` (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=356 ;
CREATE TABLE IF NOT EXISTS `relations` (
`id` int(11) NOT NULL auto_increment,
`name` char(255) default NULL,
`address` char(255) default NULL,
`postalcode` char(20) default NULL,
`city` char(255) default NULL,
`country_id` int(11) default NULL,
`telephone` char(20) default NULL,
`fax` char(20) default NULL,
`email` char(255) default NULL,
`website` char(255) default NULL,
`kvknumber` char(20) default NULL,
`license_type` tinyint(4) default NULL,
`public` tinyint(1) NOT NULL default '0',
`deleted` tinyint(1) NOT NULL default '0',
`created` datetime default NULL,
`modified` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=260 ;