如何优化日期时间条件查询?

时间:2019-06-04 08:52:45

标签: mysql optimization indexing

我有一个表cashflow和4个索引[is_dp,[is_wd],[is_dis],[time]。

`is_dp`   tinyint(1) => (0,1)
`is_wd`   tinyint(1) => (0,1)
`is_dis`  tinyint(1) => (0,1)
`time`    datetime

此表有300万行。

我的查询是:

1. SELECT * FROM `cashflow` WHERE is_dp = 1 AND time >= '2019-05-01 00:00:00' AND time <= '2019-05-31 23:59:59';

2. SELECT * FROM `cashflow` WHERE is_wd = 1 AND time >= '2019-05-01 00:00:00' AND time <= '2019-05-31 23:59:59';

3. SELECT * FROM `cashflow` WHERE is_dis = 1 AND time >= '2019-05-01 00:00:00' AND time <= '2019-05-31 23:59:59';

索引time不适用于每个键[is_dp,[is_wd],[is_dis]。

说明:

| query | possible_keys  |  key   | key_len |  ref  | rows    | Extra                               |
| 1.    | is_dp,time     | time   | 8       | NULL  | 242616  | Using index condition; Using where; |
| 2.    | is_wd,time     | is_wd  | 1       | const | 494546  | Using where;                        |
| 3.    | is_dis,time    | is_dis | 1       | const | 1089870 | Using where;                        |

如何优化它?

或复合键是一个好方法吗?

ADD KEY `dp_time` (`is_dp`,`time`);
ADD KEY `wd_time` (`is_wd`,`time`);
ADD KEY `dis_time` (`is_dis`,`time`);

非常感谢您!

1 个答案:

答案 0 :(得分:0)

对于那些 3 SELECTs,您需要所有3个这些复合索引。建议的4列索引对于其中任何一个都不是最佳的。

从左开始使用索引。使用INDEX(is_dp, is_wd, is_dis, time),查询1可以使用is_dp,但是当它到达is_wd时就退出索引。其他两个查询根本无法使用索引。

(我刚才所说的并不完全正确,但是即使使用它们,它们的效率也不高。)

我的Cookbook解释了建立最佳索引的更多信息。

Using index condition -意味着InnoDB将在引擎而不是处理程序中执行大部分或全部过滤。 (好的,这是一个模糊的解释;该查询不是讨论ICP(索引条件下推)的好工具。)

Using where-使用了某些WHERE。相当模糊。

key_len = 1-表示仅使用了索引的1个字节;大概是is_wd,等等。