我有一个名为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组合在一起会让它更快吗?
答案 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
,2
和5
被评估为布尔值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;