表结构

时间:2011-03-31 14:52:44

标签: php mysql

我有一个名为table1的表。它有3列:

id, int, auto incrementing, primary key
id2,int
description,varchar(255)

设置的唯一键是id作为主键。

从此我运行此查询:

SELECT * FROM table1 WHERE id2=1 OR 5 OR 2 LIMIT 250;

我没有将id以外的任何其他键设置为primary key,并且id2值(所有整数)有大约20种可能性,每个查询随机选择3种。

该表目前是MYISAM。

我可以做些什么来加快上述查询?

我应该在table1上设置哪些其他键?

将id和id2组合在一起会让它更快吗?

5 个答案:

答案 0 :(得分:2)

似乎你已经暗示了答案。由于您正在对语句的where子句中的id2列进行搜索,因此该列上的索引将加速这些问题。

答案 1 :(得分:1)

您应该在table1 (id2)上创建一个索引并重写查询,以便它只选择包含您提供的值的记录:

SELECT  *
FROM    table1
WHERE   id2 IN (1, 2, 5)
LIMIT 250

就像现在一样,查询是这样的:

SELECT  *
FROM    table1
WHERE   (id2  = 1) OR 2 OR 5
LIMIT 250

25被评估为布尔值TRUE

这导致返回所有记录(在限制范围内),而不是关于它们的实际值。

答案 2 :(得分:1)

您可以将id2转换为索引。

ALTER TABLE  `table1` ADD INDEX (  `id2` );

您还可以通过稍微重构

来使查询更好一点
SELECT * FROM `table1` WHERE `id2` IN (1,2,5) LIMIT 250;

答案 3 :(得分:1)

您的查询错误,您将检索整个数据集,然后将其限制为250个结果。原因是错误的WHERE子句。

WHERE id2 = 1与该特定行匹配,但“OR 5 OR 2”与ID列不匹配,它们只是评估为true。所以你要选择一切。

你可以做的是使用

SELECT * FROM table1 WHERE id2 = 1 OR id2 = 5 OR id = 2

OR

SELECT * FROM table1 WHERE id2 IN(1, 5, 2)

此外,即使id2具有低选择性,您也应该将其编入索引。原因是:您有描述列,这使得数据文件大于可能的索引文件。完全扫描索引文件比数据文件更快。你会得到一个小的好处,但这将是一个好处。

答案 4 :(得分:0)

您应该在id2上设置索引。 id上的索引无关紧要,除非你专门查询它,并且id,id2的多列索引根本没用。此外,您可以将查询更改为:

SELECT * FROM table1 WHERE id2 in (1,2,5) LIMIT 250;