哪个MySQL查询的检索速度会更快


Which MySQL query will have faster retrieval?

假设我有两个表。其中一个,我们称之为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  

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

在类型列上加一个索引,然后使用第二个版本,速度会快得多。还要注意的是,我认为你对数据库的含义有点困惑。数据库是表(以及触发器、存储过程、视图等)的集合,所以用somethingDB的名称命名表有点令人困惑。。当我说索引时,我指的是数据库索引(与您称之为索引的列无关)。

要创建列和索引,可以使用类似于以下内容(对于mysql)的

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

类似于其他DBMS的

正如注释中提到的,然后您需要加入type列。您可以有一个具有类型和自动递增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表的唯一列,因此它将是主键。