MySQL一问一答

一、问:如果有一张表,里面有个字段为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在运行时也要消耗资源维护索引,因此索引并不是越多越好。

 

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

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

 

 十二、什么是同步I/O,什么是异步I/O?

答:同步文件I/O中,线程启动一个I/O操作后会立即进入等待状态,直到I/O操作完成才醒来继续执行。而异步文件I/O方式中,线程发送一个I/O请求到内核,然后继续处理其他的事情,内核完成I/O请求后,将会通知线程I/O操作完成了。简单地说,如果是同步I/O,当一个I/O操作执行时,应用程序必须等待,直到些I/O执行完毕。相反,异步I/O操作是在后台运行的,I/O操作和应用程序可以同时运行,这就提高了系统性能。

未完待续

 

 

作者:陆炫志

出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

posted @ 2014-11-11 19:06  GoogSQL  阅读(571)  评论(0编辑  收藏  举报