当数据库单表数据量非常大的时候,使用普通查询耗时非常多,默认会根据搜索条件全表扫描;添加索引后,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
添加索引的话,首先去索引列表中查询,而我们的索引列表是B类树的数据结构,查询的时间复杂度为O(log2N),定位到特定值得行就会非常快,所以其查询速度就会非常快。
我们这里有一张表,有67万条数据
CREATE TABLE `contract_accept_detail` (
`sinoid` varchar(50) NOT NULL COMMENT '本系统唯一标识',
`contract_id` varchar(50) DEFAULT NULL COMMENT '合同编号',
`contract_sum` decimal(10,2) DEFAULT NULL COMMENT '合同金额',
`start_time` datetime DEFAULT NULL COMMENT '合同开始时间',
`stop_time` datetime DEFAULT NULL COMMENT '合同结束时间',
`contract_type` char(2) DEFAULT NULL COMMENT '贷款类型(是字典)',
`guara_type` char(2) DEFAULT NULL COMMENT '贷款形式(是字典)',
`pay_period` char(2) DEFAULT NULL COMMENT '贷款期数',
`pay_location` varchar(50) DEFAULT NULL COMMENT '贷款地点(是字典)',
`contract_status` char(2) DEFAULT NULL COMMENT '债权状态(是字典)',
`settle_time` datetime DEFAULT NULL COMMENT '结清日期',
`sinotime` timestamp NULL DEFAULT NULL COMMENT '操作时间',
PRIMARY KEY (`sinoid`),
KEY `contract_conId` (`contract_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='合同同意详情表';
此时在没有创建索引的情况下查询指定时间段一次耗时1秒多,生产上的数据量查询一次是4秒多,已经相当慢了
至此考虑需要在查询条件上添加索引,即sinotime
由于本身数据量比较大,添加索引耗时较长,建议建表时就添加
刷新库后再看表信息,已经添加上了
再次执行查询语句
即可发现查询时间大大缩短,差不多0.1秒
若将日期转化为字符串查询,效率一样
这里的sql语句查询时间段使用>=和<=比between and的效率更高!!