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);