我正在尝试破解一个名为 Phabricator / Phorge 的 FLOSS 应用程序
让我们看一下这个简单的 MySQL 表,它按 ID 及其状态( 、 等)存储一些open问题:closedinvalid
CREATE TABLE `ponder_question` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`status` varchar(32) NOT NULL,
PRIMARY KEY (`id`),
KEY `status` (`status`),
Run Code Online (Sandbox Code Playgroud)
我想先按特定状态排序,然后再按其他状态排序。所以:
SELECT * FROM ponder_question
ORDER BY status='open' DESC
LIMIT 5
Run Code Online (Sandbox Code Playgroud)
它有效,但请考虑这一点DESCRIBE。该查询显然正在检查 5000 行,这可能太多了/它正在进行全表扫描:
| ID | 选择类型 | 桌子 | 分区 | 类型 | 可能的键 | 钥匙 | 密钥长度 | 参考 | 行 | 过滤的 | 额外的 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 简单的 | 思考问题 | 无效的 | 指数 | 无效的 | 地位 | 130 | 无效的 | 5000 | 100.00 | 使用索引;使用文件排序 |
(相反,如果你EXPLAIN …