Mysql 提高sql查询性能
我运行以下查询以检索给定用户上周的位置:Mysql 提高sql查询性能,mysql,sql,database,Mysql,Sql,Database,我运行以下查询以检索给定用户上周的位置: 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_o
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`)
);
我们在user_id和timestamp上都有索引,但是,这个查询需要相当长的时间才能运行。需要帮助解决此问题。您需要按日期对表进行分区。这应该会有很大帮助 这是未经测试的,但请尝试类似的方法:
SELECT * FROM locations
WHERE user_id=20
AND timestamp > NOW() - INTERVAL 7 DAY;
要修改表格,请使用以下内容:
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`)
);
您需要用户id和时间戳的索引,顺序如下:
ALTER TABLE user_locations
PARTITION BY KEY(`index_on_timestamp`)
PARTITIONS 6;
这将完全满足
where
子句。将EXPLAIN
语句的输出张贴在此处。这将给我们一些指示,说明查询在做什么对不起,我无法在prod Db上运行Explain,但我只为特定用户查询了7天的数据。我不知道分区如何帮助查询快速运行分区的全部目的是提供一个较小的数据集供查找。如果您限制必须完成的内容,那么查询可能会更快地找到它需要的内容。查询是非常特定于时间的,数据库中有很多行。分区可能不是最佳解决方案,但我认为这个建议不值得否决。分区可能会有帮助,但不如适当的索引那么多。@GordonLinoff:我们的两个答案结合起来会提供“最佳”解决方案吗?正确的索引和分区?如果您这样认为,您还是建议按日期分区,还是改为按新的“适当”索引分区?@CenterOrbit。这将取决于几个因素。如果所有查询只使用最近的几个分区,那么只需要将这些分区的索引加载到内存中。因此,如果内存可用性限制了查询的性能,那么这是一件好事,但其影响可以忽略不计。不过,一般来说,OP可能会从分区中受益,只是对于这个特定的查询没有这么多。还需要一个帮助,这两个查询中的哪一个更适合从用户位置选择COUNT(),其中年(时间戳)=2013,月(时间戳)=11;从时间戳>='2013-11-01'和时间戳<'2013-12-01'的用户位置选择COUNT()@拉古。第二个更好,在timestamp
上使用索引。列上的函数通常阻止使用索引。
create index user_locations_user_id_timestamp on user_locations(user_id, timestamp)