面试高频问题

这一节向大家展示几个面试中常见的问题,我们的目地是通过问题能够深入掌握知识,并不是让大家记住应对答案。大家可通过文中的解析,再自己动手实践然后整理出适合自己的标准答案。

3.1 一个查询语句慢,从哪些方面查找原因

首先,我们如何感知一个查询语句慢。有如下两种途径:

  1. 手动感知。在查询前后,我们插入时间戳,计算两次的时间戳,看看时间是不是比较长。
  2. 利用慢查询日志。MySql提供了慢查询日志的功能,可以设一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询日志文件中。该阈值可以通过参数long_query_time来设置,默认值为10,代表10秒。

当知道一条SQL语句查询较慢,有哪些比较好的查找原因的思路呢?我的建议如下:
  • 数据量大。这是最直观的原因。如果都是进行全表扫描操作,一个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%内容,订阅专栏后可继续查看/也可单篇购买

Java开发之数据库索引篇,适合所有求职开发岗的同学~ 本专刊购买后即可解锁所有章节,故不可以退换哦~

全部评论

相关推荐

勇敢的90后想交流:我愿意付费上班,楼主你就安心字节待着吧,我是真的喜欢上班
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务