以下哪个查询会更快且更优化(以及为什么):
SELECT * FROM items WHERE w = 320 AND h = 200
(w和h均为INT类型)SELECT * FROM items WHERE dimensions = '320x200'
(dimensions是VARCHAR类型)
以下哪个查询会更快且更优化(以及为什么):
SELECT * FROM items WHERE w = 320 AND h = 200
(w和h均为INT类型)
SELECT * FROM items WHERE dimensions = '320x200'
(dimensions是VARCHAR类型)
CREATE TABLE items (id INTEGER PRIMARY KEY, w INTEGER, h INTEGER)
平均执行 SELECT * FROM items WHERE w = 320 and h = 200
的时间(20次运行)是5.39±0.29微秒。CREATE TABLE items (id INTEGER PRIMARY KEY, dimensions TEXT)
执行 SELECT * FROM items WHERE dimensions = '320x200'
的平均时间为5.69±0.23微秒。SELECT w * h, 2 * (w + h) FROM items
试着写出另一种方法的相应查询。select *
需要获取它。直观来说,如果你没有在这些列上创建INDEX
索引,整数比较似乎更快。
在整数比较中,您可以使用逻辑运算符直接比较32位值的相等性。
另一方面,字符串是字符数组,难以进行比较。需要逐个字符进行比较。
然而,另一个问题是,在第二个查询中,您有1个字段要比较,在第一个查询中,您有2个字段要比较。如果您有100万条记录,并且没有在列上创建索引,那么在最坏情况下(不幸的是,最后的结果就是您正在寻找的内容或者根本找不到),这意味着您可能会进行100万次字符串比较。
另一方面,如果您有100万条记录,并且它们全部都是w=320
,那么您将对h
进行比较。这意味着需要进行200万次比较。但是,如果您在这些字段上创建了索引,则它们几乎相同,因为VARCHAR将被哈希(需要O(1)
常数时间),并将使用INT比较进行比较,需要O(logn)
时间。
结论:这取决于具体情况。建议在可搜索的列上使用索引并使用整数进行比较。
首选第一个,因为比较数值数据更快。
这取决于数据和可用的索引。但是,VARCHAR版本更快是完全可能的,因为搜索单个索引比两个索引更快。如果值的组合提供了唯一(或“大多数”唯一)的结果,而每个单独的H/W值都有多个条目,则可以使用单个索引将其缩小到更小的集合。
另一方面,如果您在两个整数列上有一个多列索引,那么这可能是最有效的。