0

mysql(innodb)会支持更高的查询率(每秒查询数),如(A)或(B)吗?

(一个)SELECT * FROM t1 WHERE pkey BETWEEN 2000 and 2001 AND x > 300

在 (A) 中,主键选择 800 行的范围。“x”未编入索引。有一个范围查找和 1 个长度为 200kb 的连续读取。

(乙)(SELECT * FROM t1 WHERE pkey BETWEEN 2000 and 2001 AND x > 300) UNION ALL (SELECT * FROM t1 WHERE pkey BETWEEN 3000 and 3001 AND x > 300)

在 (B) 中,主键选择 200 行的范围。“x”未编入索引。有两个范围查找和 2 个长度为 50kb 的连续读取。

综上所述,(A) 有 2 倍的磁盘寻道,但有 1/2 的连续读取。相反,(B) 有一半的磁盘寻道,但连续读取是 2 倍。

一般来说,我认为搜索速度很慢,连续读取速度很快,但我认为额外的一次搜索比读取 10MB 的额外数据更可取。大致的权衡点在哪里?

4

2 回答 2

0

优化器应该决定如何实现查询。只需按照您的意愿编写即可。

使用 EXPLAIN 大致了解它做了什么。可能是它对 pkey 上的索引进行了两次范围扫描。

一般来说,阅读更少的行会更好。您还可以在缓冲池中保留更多。在一般情况下,两次范围扫描优于一次。

我假设您的表 t1 将不完全适合内存,在这种情况下,它主要是学术性的。

于 2010-02-26T07:17:57.467 回答
0

你真的需要用 EXPLAIN 的输出来补充你的两个选项......理论上哪个更快并不重要,重要的是 MySQL 将有哪些优化可用。

让我为你猜猜:

a) 范围 pkey 查找非常有效,因为它位于聚集索引上。对于范围内的所有内容,它读取“下一个,下一个”以检查 X 是否匹配。

b) 这是一系列点查找。但它会创建一个临时表,即使您认为它可以将结果传递给您(!)http://www.facebook.com/note.php?note_id=276225210932

我的投票几乎可以肯定是(a)。

于 2010-07-24T14:11:47.043 回答