今天在说Mysql查询优化之前,我先说一个常见的面试题,并带着问题深入探讨研究。这样会让大家有更深入的理解。
一
Mysql数据库中一个表里有一千多万条数据,怎么快速的查出第900万条后的100条数据?
select * from table limit 9000000,100;
复制

耗时:0.005s
耗时:0.006s
耗时:0.013s
耗时:0.104s
耗时:0.395s
耗时:0.823s
耗时:3.909s
耗时:10.761s
1,limit语句的查询时间与起始记录的位置成正比。
2,mysql的limit语句是很方便,但是对记录很多的表并不适合直接使用。
对大数据量limit分页性能优化
我的test表使用InnoDB作为存储引擎,id作为自增主键,默认为主键索引。那我们现在用覆盖索引查询,看看效果如何:
SELECT id FROM test LIMIT 9000000,100;
复制
现在优化的方案有两种,即通过id作为查询条件使用子查询实现和使用join实现;
select * from test
where id >= (select id from test limit 9000000,1)
limit 0,100
复制
耗时 4.262s;
SELECT * FROM test a
JOIN (SELECT id FROM test LIMIT 9000000,100) b
ON a.id = b.id
复制
SELECT * FROM test a JOIN (SELECT id FROM test LIMIT 1000000,100) b ON a.id = b.id
复制
二
你用过mysql那些存储引擎,他们都有什么特点和区别?
1,InnoDB支持事务,MyISAM不支持。对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
2,InnoDB支持外键,而MyISAM不支持。
3,InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
4,InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快。
5,Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;5.7以后的InnoDB支持全文索引了。
6,InnoDB支持表、行级锁(默认),而MyISAM支持表级锁。;
7,InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有。
8,Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI。
三
Mysql复杂查询语句的优化,你会怎么做?
1,使用EXPLAIN关键词检查SQL。EXPLAIN可以帮你分析你的查询语句或是表结构的性能瓶颈,就得EXPLAIN 的查询结果还会告诉你你的索引主键被如何利用的,你的数据表是如何被搜索和排序的,是否有全表扫描等;
2,查询的条件尽量使用索引字段,如某一个表有多个条件,就尽量使用复合索引查询,复合索引使用要注意字段的先后顺序。
3,多表关联尽量用join,减少子查询的使用。表的关联字段如果能用主键就用主键,也就是尽可能的使用索引字段。如果关联字段不是索引字段可以根据情况考虑添加索引。
4,尽量使用limit进行分页批量查询,不要一次全部获取。
5,绝对避免select *的使用,尽量select具体需要的字段,减少不必要字段的查询;
6,尽量将or 转换为 union all。
7,尽量避免使用is null或is not null。
8,要注意like的使用,前模糊和全模糊不会走索引。
9,Where后的查询字段尽量减少使用函数,因为函数会造成索引失效。
10,避免使用不等于(!=),因为它不会使用索引。
11,用exists代替in,not exists代替not in,效率会更好;
12,避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤,这个处理需要排序,总计等操作。如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销。
13,千万不要 ORDER BY RAND()
接下来会继续总结一些面试中的问题共享给大家,如果觉得内容不错请关注此公众号,我会不定期的推送一些干货给大家。
推荐阅读:
SpringBoot电商项目实战 — ElasticSearch接入实现
扫码关注公众号,发送关键词获取相关资料:
发送“Springboot”领取电商项目实战源码;
发送“SpringCloud”领取cloud学习实战资料;