select * from employees where id = 201085;
查询耗时如下:
通过 explain 来查看这条 sql 时,结果如下:
从结果可以看出,索引是起作用的。当 sql 改成如下形式时:
select * from employees where id + 1 = 201085;
查询耗时如下:
通过 explain 来查看这条 sql 时,结果如下:
从结果中看出,索引失效了,这是因为我们需要把索引字段的值都取出来,然后依次进行表达式的计算来进行条件判断,因此采用的就是全表扫描的方式,运行时间也会慢好多。
select * from employees where first_name like 'Moo%';
查询耗时如下:
通过 explain 来查看这条 sql 时,结果如下:
从结果可以看出,索引是起作用的。当 sql 改成如下形式时:
select * from employees where substring(first_name, 1, 3) = 'Moo';
查询耗时如下:
通过 explain 来查看这条 sql 时,结果如下:
从结果中可以看出,索引失效了,采用了全表扫描的方式,运行时间也慢了好多。
在 first_name 上创建了索引,在 last_name 上没有创建索引,sql 如下:
select * from employees where first_name = 'Moon' or last_name = 'Demke';
查询耗时如下:
通过 explain 来查看这条 sql 时,结果如下:
从结果中可以看出,first_name 索引并没有起作用。
select * from employees where first_name like '%oon';
查询耗时如下:
通过 explain 来查看这条 sql 时,结果如下:
从结果中可以看出,first_name 索引并没有起作用。
索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。当数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但是当数据量逐渐增大是,性能则会急剧下降。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高几个数量级,”最优“的索引有时比一个”好的“索引性能要好两个数量级。对于索引底层的了解有助于我们优化创建的索引。
employees 的建表语句:
CREATE TABLE `employees` (
`id` int NOT NULL AUTO_INCREMENT,
`emp_no` int NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=300025 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。