注:实际情况会因建表语句和服务器的配置造成偏差
测试环境 :8核CPU 16G运行内存
建表语句:
CREATE TABLE `user` (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`birthday` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_username` (`username`(191))
) ENGINE=InnoDB AUTO_INCREMENT=2000016 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=COMPACT;
在数据库中插入200w条数据 ,尽量采用随机数值(模拟真实环境),考虑到节省插入时间 采用了分段批量插入 数据重复度较高,测出结果与真实环境会有较大偏差
未自定义索引
无索引:首次查询 不走索引的条件下进行查询 耗时为 700ms左右 之后查询同样的sql,稳定在430ms (可能mysql自带的缓存机制)
有索引(主键索引):首次查询140MS 之后稳定在2ms
自定义索引
单一索引的情况
加入索引的耗时为 username字段的索引时间+主键索引的耗时 因为测试中name字段重复度较高 因此name索引查询几乎不耗时间,最终结果为4ms
联合索引
未加索引前: 第一次查询时间为 650ms 之后为450ms
加索引之后:发现非联合索引在耗时情况上没有很大区别
插入操作
只有主键索引情况下: 请求25次
加上联合索引之后:
结论
看加索引的数据复杂程序 对索引的影响效果
再数据重复度较高的情况下,影响不是很大
修改操作
有索引:
不加索引: