我有一个表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`);
非常感谢您!
答案 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
,等等。