I have a large table which contains sensor data, along with the fields:
sensor_id
timestamp
I do queries against it using these fields almost exclusively. There are multiple sensors, and different sensors might have the same timestamp for a given set of data, so neither index can be unique.
I created three indexes: one for each of these columns (not unique), and a compound one for both (unique).
The table is constantly being written to, and queries to read data seem increasingly slow.
My question is, is the compound index unnecessary? Would it be faster to have only the two separate indexes? (Or remove those and keep only the compound index?) No other columns are used for filtering query data.
My question is similar to this one: Do I need separate indexes for each type of query, or will one multi-column index work?
Edit:
Here's the table definition:
CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`sensor_id` int(10) unsigned NOT NULL,
`timestamp` datetime NOT NULL,
-- 71 other columns...
PRIMARY KEY (`id`),
UNIQUE KEY `IX_sensor_timestamp` (`sensor_id`,`timestamp`),
KEY `IX_timestamp` (`timestamp`),
KEY `IX_sensor_id` (`sensor_id`)
) ENGINE=InnoDB AUTO_INCREMENT=78542614 DEFAULT CHARSET=latin1
Best Answer
It might be worth posting the table definition from your other question for clarity.
The composite index is doing a few things for you:
There are a number of caveats to this, so it's good idea to look at the
EXPLAIN
output for your queries and verify what indexes they're using. Keep also in mind that indexes can support the read part of UPDATE and DELETE queries, as well as JOINs, GROUP BY, ORDER BY, and other operations I'm neglecting.An example of a scenario where the composite index is unnecessary would be if you don't care about the uniqueness constraint and all your queries filter on timestamp or sensor_id, but not both.
The single-column index on
sensor_id
is actually redundant since the composite index on (sensor_id
,timestamp
) can be used by the same queries, but still you might find that some queries perform faster when doing scans on the single-column index compared to using a composite index with a wider key. The difference might not be enough to matter, though, and some testing will probably be required to find out.In addition to looking at the
EXPLAIN
output for your queries, tools such aspt-index-usage
from the Percona toolkit or the tableINFORMATION_SCHEMA.INDEX_STATISTICS
if you're running Percona Server or MariaDB can help you assess what indexes are actually being used.References:
The Optimization That (Often) Isn’t: Index Merge Intersection
Practical MySQL indexing guidelines