Below is a location table
CREATE TABLE locations (
`id` int(11),
`user_id` int(11),
`timestamp` datetime
PRIMARY KEY (`id`),
KEY `index_on_timestamp` (`timestamp`),
KEY `index_on_user_id` (`user_id`)
);
我运行以下查询来检索过去一周的给定用户的位置:
SELECT * FROM locations
WHERE user_id=20
AND timestamp > NOW() - INTERVAL 7 DAY;
我们在user_id和timestamp上都有索引,但是,这个查询需要很长时间才能运行。需要帮助解决这个问题。
答案 0 :(得分:3)
您希望 用户ID和时间戳的索引按顺序排列:
create index user_locations_user_id_timestamp on user_locations(user_id, timestamp)
这将完全满足where
条款。
答案 1 :(得分:0)
您需要考虑按日期对表格进行分区。这应该有很大帮助。 http://dev.mysql.com/doc/refman/5.1/en/partitioning-types.html
这是未经测试的,但尝试类似于此的内容:
CREATE TABLE user_locations (
`id` int(11),
`user_id` int(11),
`state` varchar(255),
`country` varchar(255),
`timestamp` datetime
PRIMARY KEY (`id`),
KEY `index_on_timestamp` (`timestamp`),
KEY `index_on_user_id` (`user_id`),
PARTITION BY KEY(`index_on_timestamp`)
);
要修改表格,您可以使用以下内容:
ALTER TABLE user_locations
PARTITION BY KEY(`index_on_timestamp`)
PARTITIONS 6;