哪个MySQL查询会有更快的检索?

时间:2012-02-21 07:00:38

标签: php mysql performance

说我有两张桌子。一,让我们称之为 typeDB ,对于包含索引,类型名称和另一个表中此类型的元素的ID列表的行具有。要获取第二个表中的行 - 我们称之为 dataDB - 类型为0,我基本上可以做(在草率的伪代码中):

$list = SELECT list FROM typeDB WHERE index=0  

然后我可以使用:

从dataDB获取行
$array = explode($list)  
for (every element of list $i)  
    $results = SELECT * FROM dataDB WHERE index=$array[$i]  

所以我的问题是......这比仅仅在dataDB中有一个类型字段,然后做:

$results = SELECT * FROM dataDB WHERE type=$type  

我的想法是,因为第一种方法不必遍历整个数据库,所以会更快。但我真的不知道数据库查询是如何工作的。您认为哪种方式最有效?感谢。

1 个答案:

答案 0 :(得分:1)

在type列上添加索引并使用第二个版本,它会快得多。 另请注意,我认为您对数据库的含义感到困惑。数据库是表的集合(以及触发器,存储过程,视图等),因此使用名称somethingDB命名表有点令人困惑。 当我说索引时我指的是数据库索引(与看起来像你所谓的索引的列无关)。

创建列和索引你使用这样的东西(对于mysql)

ALTER TABLE dataDB ADD COLUMN `type` varchar(64)
CREATE INDEX type_index ON dataDB(type)

与其他DBMS相似

在评论中提到,然后您需要加入类型列。 您可以拥有一个具有类型和自动增量ID的表以及类型/名称字段上的唯一约束。然后使用自动增量ID作为外键,或者只使用一列(类型)创建一个类型表是主键。无论哪种方式都有效,两者都有好处(我会选择自动增量列,因为我相信它在代码中更灵活)。

如果您确实选择了自动增量列,则可以使用:

CREATE TABLE dataType (
 id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 name VARCHAR(64) UNIQUE
)



ALTER TABLE dataDB ADD COLUMN `type` INT;
ALTER TABLE dataDB ADD CONSTRAINT fk_type FOREIGN KEY (type) REFERENCES dataType(id);

然后当你想要查询dataDB时,如果你想要类型名称(而不是整数),你会像这样进行连接:

SELECT dataDB.list, dataType.name FROM dataDB 
INNER JOIN dataType ON dataDB.type=dataType.id 
where dataDB.type="$type"

这假设类型是某种名称而不是开头的整数,如果它们一直是整数,只需将int值作为dataType表的唯一列,因此它就是你的主键。