当标志列是约束时,SELECT查询缓慢

时间:2010-02-09 04:03:18

标签: sql mysql

我有一个相当简单的表叫做小部件。每行包含一个id,一个描述和一个is_visible标志:

CREATE TABLE `widgets` (
  `id` int auto_increment primary key, 
  `description` varchar(255), 
  `is_visible` tinyint(1) default 1
);

我想发出一个查询,选择可见小部件子集的描述。以下简单查询可以解决问题(其中nm是整数):

  SELECT `description` 
    FROM `widgets` 
   WHERE (`is_visible`) 
ORDER BY `id` DESC 
   LIMIT n, m;

不幸的是,这样的查询,必须扫描至少n+m行。有没有办法通过重新处理查询或修改架构来使此查询扫描更少的行?

2 个答案:

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