我有一个相当简单的表叫做小部件。每行包含一个id,一个描述和一个is_visible标志:
CREATE TABLE `widgets` (
`id` int auto_increment primary key,
`description` varchar(255),
`is_visible` tinyint(1) default 1
);
我想发出一个查询,选择可见小部件子集的描述。以下简单查询可以解决问题(其中n
和m
是整数):
SELECT `description`
FROM `widgets`
WHERE (`is_visible`)
ORDER BY `id` DESC
LIMIT n, m;
不幸的是,这样的查询,必须扫描至少n+m
行。有没有办法通过重新处理查询或修改架构来使此查询扫描更少的行?
答案 0 :(得分:2)
使用索引获得更快的查询结果:
ALTER TABLE `widgets` ADD INDEX ( `is_visible` )
答案 1 :(得分:1)
有没有办法让这个查询扫描更少的行?
不,不是真的。鉴于它是一个二进制标志,你不会从在该字段上创建索引中获得太多好处。
我将详细说明,给出了downvote。
您必须考虑索引的基数(唯一值的数量)。从MySQL手册:
基数越高,MySQL在进行连接时使用索引的可能性就越大。
在那个领域将是2.它没有比那个低得多。
另见:Why does MySQL not use an index on a int field that's being used as a boolean?
Indexing boolean fields