Mysql 如何按一列进行筛选,同时按另一列进行排序?

Mysql 如何按一列进行筛选,同时按另一列进行排序?,mysql,query-optimization,innodb,Mysql,Query Optimization,Innodb,模式: 查询: CREATE TABLE `Log` ( `EntryId` INT UNSIGNED NOT NULL AUTO_INCREMENT, `EntryTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(), `Severity` ENUM( 'LOG_LEVEL_CRITICAL', 'LOG_LEVEL_ERROR', 'LOG_LEVEL_WARNING'

模式:

查询:

CREATE TABLE `Log` (
    `EntryId` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `EntryTime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(),
    `Severity` ENUM(
        'LOG_LEVEL_CRITICAL',
        'LOG_LEVEL_ERROR',
        'LOG_LEVEL_WARNING',
        'LOG_LEVEL_NOTICE',
        'LOG_LEVEL_INFO',
        'LOG_LEVEL_DEBUG'
    ) NOT NULL,

    `User` TEXT,
    `Text` TEXT NOT NULL,

    PRIMARY KEY(`EntryId`),
    KEY `EntryTime` (`EntryTime`)
) ENGINE=InnoDB COMMENT="Log of server activity";
根据观察和执行计划(尽管这需要对小型数据集执行
强制索引
),索引的使用符合要求:

SELECT 
   `EntryId`,
   UNIX_TIMESTAMP(`EntryTime`) AS `EntryTime_UnixTS`
   `Severity`,
   `User`,
   `Text`
FROM `Log` 
ORDER BY `EntryTime` DESC, `EntryId` DESC
LIMIT 0, 20
现在我想添加一个范围条件:

id  select_type  table  type  possible_keys  key        key_len  ref  rows  Extra
1   SIMPLE       Log    index \N             EntryTime  4        \N   20    

WHERE`Severity`在我看来,您需要创建一个包含三个必填字段的索引:

WHERE `Severity` <= 'LOG_LEVEL_WARNING'

服务器将能够使用此索引,因为它包含执行查询所需的所有内容。

严重性、EntryTime、EntryId
上创建一个新索引怎么样?@juergend:WHERE
将很慢,不是吗?您的新严重性指数未被删除used@OscarP埃雷兹:嗯,这似乎奏效了。我不知道该怎么做,尤其是因为我从中学到了什么!有人告诉我,索引上的后续PK是错误的。为什么这里不同?这似乎是可行的,但我无法从概念上解释原因:(我的意思是,在范围条件下,无论发生什么情况,它都必须进行排序,对吗?那么结果为何如此之快:/我从未读到过……这是真的吗?你发现有任何官方mysql页面说明了这一点吗?据我所知,使用索引将帮助服务器更快地定位范围内的所有记录(对数?)。
CREATE INDEX test_idx
          ON Log (Severity,EntryTime,EntryId);