提高sql查询性能

时间:2014-03-21 01:58:22

标签: 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_on_user_id` (`user_id`)
);

我运行以下查询来检索过去一周的给定用户的位置:

SELECT * FROM locations 
WHERE user_id=20 
AND timestamp > NOW() - INTERVAL 7 DAY;

我们在user_id和timestamp上都有索引,但是,这个查询需要很长时间才能运行。需要帮助解决这个问题。

2 个答案:

答案 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;