在 sql 上添加保证的 where 条件是否可以提高性能?
Does adding the guaranteed where condition on sql can improve performance?
假设有一个关于记录网站访问的 table。
(id is the only index column)
| id | domain | logged_at |
|----|------------|--------------------------|
| 1 | yahoo.com | 2002-04-08T16:44:32.654Z |
| 2 | google.com | 2002-04-02T19:12:12.124Z |
| 3 | google.com | 2002-04-01T21:54:29.852Z |
| 4 | amazon.com | 2002-03-10T02:11:01.555Z |
| 5 | cnn.com | 2002-05-11T09:26:34.292Z |
| 6 | amazon.com | 2002-04-02T22:06:18.119Z |
...
| 2468955885 | netflix.com | 2011-01-08T16:44:32.654Z |
| 2468955886 | facebook.com | 2011-07-02T19:12:12.124Z |
| 2468955887 | uber.com | 2011-05-01T21:54:29.852Z |
| 2468955888 | google.com | 2011-02-10T02:11:01.555Z |
| 2468955889 | uber.com | 2011-04-11T09:26:34.292Z |
| 2468955890 | amazon.com | 2011-05-02T22:06:18.119Z |
我想过滤 uber.com
行。
我可以保证 uber.com
访问日志必须存在于 2009-03-01T00:00:00.000Z
之后。
SQL-A
SELECT * FROM table where domain = 'uber.com';
SQL-B
SELECT * FROM table where domain = 'uber.com' AND logged_at > '2009-03-01T00:00:00.000Z'
SQL-A 和 SQL-B 在性能上有区别吗?
一般不会。
我可以想到两种会影响性能的情况:
- 有一个以
logged_at
开头的索引,没有以 domain
作为第一列的索引。
- table 被
logged_at
分割。
您在问题中没有提及任何可能是这两种情况的内容。
对于常规查询,您需要 (domain)
或 (domain, logged_at)
上的索引。两个查询都将使用两个索引并且具有非常相似的性能。
我应该注意到,第二个查询会因不必要的日期比较而产生少量开销。但是,如果您有大量数据,这可能接近于无法测量。
假设有一个关于记录网站访问的 table。
(id is the only index column)
| id | domain | logged_at |
|----|------------|--------------------------|
| 1 | yahoo.com | 2002-04-08T16:44:32.654Z |
| 2 | google.com | 2002-04-02T19:12:12.124Z |
| 3 | google.com | 2002-04-01T21:54:29.852Z |
| 4 | amazon.com | 2002-03-10T02:11:01.555Z |
| 5 | cnn.com | 2002-05-11T09:26:34.292Z |
| 6 | amazon.com | 2002-04-02T22:06:18.119Z |
...
| 2468955885 | netflix.com | 2011-01-08T16:44:32.654Z |
| 2468955886 | facebook.com | 2011-07-02T19:12:12.124Z |
| 2468955887 | uber.com | 2011-05-01T21:54:29.852Z |
| 2468955888 | google.com | 2011-02-10T02:11:01.555Z |
| 2468955889 | uber.com | 2011-04-11T09:26:34.292Z |
| 2468955890 | amazon.com | 2011-05-02T22:06:18.119Z |
我想过滤 uber.com
行。
我可以保证 uber.com
访问日志必须存在于 2009-03-01T00:00:00.000Z
之后。
SQL-A
SELECT * FROM table where domain = 'uber.com';
SQL-B
SELECT * FROM table where domain = 'uber.com' AND logged_at > '2009-03-01T00:00:00.000Z'
SQL-A 和 SQL-B 在性能上有区别吗?
一般不会。
我可以想到两种会影响性能的情况:
- 有一个以
logged_at
开头的索引,没有以domain
作为第一列的索引。 - table 被
logged_at
分割。
您在问题中没有提及任何可能是这两种情况的内容。
对于常规查询,您需要 (domain)
或 (domain, logged_at)
上的索引。两个查询都将使用两个索引并且具有非常相似的性能。
我应该注意到,第二个查询会因不必要的日期比较而产生少量开销。但是,如果您有大量数据,这可能接近于无法测量。