面试高频问题
这一节向大家展示几个面试中常见的问题,我们的目地是通过问题能够深入掌握知识,并不是让大家记住应对答案。大家可通过文中的解析,再自己动手实践然后整理出适合自己的标准答案。
3.1 一个查询语句慢,从哪些方面查找原因
首先,我们如何感知一个查询语句慢。有如下两种途径:
- 手动感知。在查询前后,我们插入时间戳,计算两次的时间戳,看看时间是不是比较长。
- 利用慢查询日志。MySql提供了慢查询日志的功能,可以设一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。该阈值可以通过参数long_query_time来设置,默认值为10,代表10秒。
- 数据量大。这是最直观的原因。如果都是进行全表扫描操作,一个100行的表和一个100万行的表的执行时间肯定不同。
- 没有使用索引。例如你的条件是 where c = 1,但你没有在c字段建立索引,导致了全表扫描,这当然也会导致查询慢。
- 索引失效。你记得明明在字段c上建立了索引,你的SQL语句的查询条件也是where c **,但查询依然很慢,你用explain查看执行过程,发现查找居然没走索引,这就是索引失效的场景。下一个问题,我们来详细谈谈哪些错误的用***导致索引失效。
3.2 索引失效的场景
我们先来创建一张表,并插入100000行数据,以此来证明索引是不是真的失效。CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(45) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 delimiter ;; create procedure idata() begin declare i int; set i=1; while(i<=100000) do insert into user values(i, 'lc', i); set i=i+1; end while; end;; delimiter ; call idat为了看到每条语句的查询时间,我们执行 set profiling=1。首先我们执行 select * from user where age = 2; 执行 show profiles; 可见执行耗时为0.04秒。 我们在age上增加一个索引,ALTER TABLE ADD INDEX index_age; 再执行 select * from user where age = 2; 执行耗时为0.003秒,可见索引起来效果。
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
数据库索引-笔面试必考点15讲 文章被收录于专栏
Java开发之数据库索引篇,适合所有求职开发岗的同学~ 本专刊购买后即可解锁所有章节,故不可以退换哦~