一、问题
在对Mysql数据库查询时,我们经常会对SQL语句进行优化,以此来提高我们的查询效率。有时一个小小的改动,对于大数据量的表来说,可能有成倍的提升效果。
二、建测试表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for person
-- ----------------------------
DROP TABLE IF EXISTS `person`;
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`userName` varchar(64) DEFAULT ULL,
`age` varchar(64) DEFAULT NULL,
`comment` varchar(500) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
其中,userId字段上增加了索引
三、测试数据
可以通过python脚本批量导入测试数据,可参考我之前的文章,Python应用02--批量往Mysql数据库插入数据
测试目标:10w+数据
四、SQL分析
以下SQL是模拟场景,一个用户在不同age(区间0-100不等)阶段提交了多条记录,一个age可以出现多条记录,不必纠结表设计是否合理,可自行转换为相应业务表
1、小白写的SQL
select * from person where userId = 730 and age = '18' order by id desc limit 1000;
2、大神写的SQL
select p.* from
(select * from person where userId = 730 order by id desc limit 1000) p
where p.age = '18'
如果你能分析其中的利弊,说明你达到3年以上的Java开发工作经验。
3、2条SQL实验结果
在10w+数据量下,大神写的sql速度比小白的快5.5倍
五、总结
大神写的SQL相比较于小白在索引的检索上快,合理的利用单列索引,但是也有一定的缺点,大神检索的条数在某些情况下是大于等于小白检索的条数,具体场景具体分析,本实验主要是研究其中的原理。
路漫漫其修远兮,吾将上下而求索!
网友评论