Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30131
  • 博文数量: 12
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 177
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-09 10:25
个人简介

我叫陆哥,一位热爱学习,热爱分享营销案例、裂变营销、商业模式的斜杠青年。

文章分类

全部博文(12)

文章存档

2019年(1)

2014年(11)

我的朋友

分类: Mysql/postgreSQL

2014-12-12 14:55:57

一、问:如果有一张表,里面有个字段为id的自增主键,当已经向表里面插入了10条数据之后,删除了id为8,9,10的数据,再把mysql重启,之后再插入一条数据,那么这条数据的id值应该是多少,是8,还是11? 

答:如果表的类型为MyISAM,那么是11。如果表的类型为InnoDB,则id为8。 这是因为两种类型的存储引擎所存储的最大ID记录的方式不同,MyISAM表将最大的ID记录到了数据文件里,重启mysql自增主键的最大ID值也不会丢失; 而InnoDB则是把最大的ID值记录到了内存中,所以重启mysql或者对表进行了OPTIMIZE操作后,最大ID值将会丢失。

 

二、MySQL内存溢出和内存泄漏区别在哪?

答:内存溢出:内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

    内存泄漏:内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光(如果free -m,看到内存use得比较多,cacahe比较少时,可能发生了内存泄漏了,这时需要重启下MySQL实例来释放内存)

 

三、change和modify都可以修改表的定义,那么它们有什么不同?

答:不同的是修改列时,change后面需要写两次列名,不方便;但change的优点是可以修改列名称,而modify则不能。

 

四、having和where都是对结果进行条件过滤的,那么两者区别在哪?

答:having和where的区别在于having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,如果逻辑允许,我们尽量用where先过滤记录,这样因为结果集减少,将对聚合的效率大大提高,最后再根据逻辑看是否用having进行再过滤。

 

五、当发现慢查询日志里有大量慢查询的记录,那我们优先处理出现频率最多的,还是耗时最多的呢?

答:我们应该优先处理慢查询出现频率比较高的sql语句,因为这些请求发生的次数是最频繁,意味着是紧急的;其次处理出现频率不高但耗时又比较长的慢查询,因为有些耗时比较长的慢查询,可能是偶发的情况,可能一周来一次或者一个月几次,这种情况还是可以接受的,不是紧急优先处理

 

六、当表的数据量大于1000万时,MySQL的性能会急剧下降吗?

答:不会,MySQL是数据库,不是文件,随着数据的增加,性能当然会有所下降,但是这些下降不是线性的,如果用户选择正常的存储引擎,以及正确的配置,再多的数据量MySQL也能承受。

 

七、通常情况下,hash索引可以一次定位,为啥还要用B+树索引?

答:1. hash索引查找数据基本上能一次定位数据,当然有大量碰撞的话性能也会下降。而btree索引就得在节点上挨着查找了,很明显在数据精确查找方面hash索引的效率是要高于btree的;
2. 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;
3. 对于btree支持的联合索引的最优前缀,hash也是无法支持的,联合索引中的字段要么全用要么全不用。提起最优前缀居然都泛起迷糊了,看来有时候放空得太厉害;
4. hash不支持索引排序,索引值和计算出来的hash值大小并不一定一致。

 

八、表A有1000万条数据(有3列,其值完全一样,但分别为主键、唯一索引、非唯一索引),对比:1、通过主键随机取10万条数据;2、通过非唯一辅助索引随机取10万条数据;3、通过唯一辅助索引随机取10万条数据;

这3个行为,有区别吗?

答:第一和第三种情况的速度一样快,第二种情况的速度最慢,因为通过非唯一性辅助索引找到数据后,由于不确定性,还会往后多扫一会,所以查询速度最慢



九、二进制日志和重做日志都是记录事务的日志,那它们有什么区别?

答:二进制日志会记录所有与MySQL数据库有关的日志记录,包括InnoDB、MyISAM、Heap等其他存储引擎的日志。而InnoDB存储引擎的重做日志只是记录有关该引擎本身的事务日志。其次,记录的内容不同,无论用户将二进制日志文件记录的格式设为STATEMENT还是ROW,又或者MIXED,其记录的都是关于一个事务的具体操作内容,即该日志逻辑日志。而InnoDB存储引擎的重做日志文件记录的是关于每个页(Page)的更改的物理情况。


十、既然索引可以加快查询速度,那么是不是只要是查询语句需要,就建上索引?

答:答案是否定的,因为索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,另外,MySQL在运行时也要消耗资源维护索引,因此索引并不是越多越好。

 

 十一、创建约束不就是通常创建索引的方法吗?那约束和索引有什么区别?

答:的确,当用户创建一个唯一索引就是创建一个唯一约束。但是约束和索引的概念还是有所不同的,约束更是一个逻辑的概念,用来保证数据的完整性,而索引是一个数据结构,既有逻辑上的概念,在数据库中还代表着物理存储的方式。





未完待续


阅读(504) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~