It might be worth posting the table definition from your other question for clarity.
The composite index is doing a few things for you:
- As you know, enforcing uniqueness on (sensor_id, timestamp); I'm unsure whether this is an important data integrity constraint.
- Allowing queries that filter on both columns to look up matching rows by using a single index. MySQL can answer some queries (equality conditions on multiple columns are the ones I know about) by merging two indexes, but this tends to be significantly slower compared to using a single composite index.
- The index can also be used to search for values in a left-based subset of the composite index, but not a right-based subset. So in this case it could help a query that filters on sensor_id values or sensor_id and timestamp values, but not timestamp values alone.
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 as pt-index-usage
from the Percona toolkit or the table INFORMATION_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
While Rolando has my vote, because he is right in your case, I want to answer your original question (for you in the future and for others) regarding percona toolkit:
pt-table-sync
is not what you want. Think about pt-online-schema-change
. While there are some hard corners, it works on RDS with the right configuration or minimal changes on the script. pt-table-sync
will also fix the issues with rds in the next release. There are other alternatives for online schema changes, oak-toolkit and Facebook ones.
As an alternative, you need a spare slave that can suffer the lag for the time the ALTER
is running and then doing a controlled switchover.
Best Answer
Changing the data type of a column causes a table restructure, which will have the side-effect of rebuilding all indexes for the table (not only those referencing the column you altered, but all indexes in that table).
You don't need to drop or recreate the indexes yourself; it's already done by the time the ALTER TABLE finishes.