摘要: Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide 书籍推荐 《高性能MySQL : 第3版》 文字教程推荐 MySQL 教程(菜鸟教程) MySQL教程(易百教程) 视频教程推荐...html
Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guidemysql
书籍推荐
《高性能MySQL : 第3版》git
文字教程推荐
MySQL 教程(菜鸟教程)github
视频教程推荐
基础入门: 与MySQL的零距离接触-慕课网算法
Mysql开发技巧: MySQL开发技巧(一) MySQL开发技巧(二) MySQL开发技巧(三)sql
Mysql5.7新特性及相关优化技巧: MySQL5.7版本新特性 性能优化之MySQL优化数据库
MySQL集群(PXC)入门 MyCAT入门及应用segmentfault
常见问题总结
MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇缓存
字符集指的是一种从二进制编码到某类字符符号的映射。校对规则则是指某种字符集下的排序规则。Mysql中每一种字符集都会对应一系列的校对规则。
Mysql采用的是相似继承的方式指定字符集的默认值,每一个数据库以及每张数据表都有本身的默认值,他们逐层继承。好比:某个库中全部表的默认字符集将是该数据库所指定的字符集(这些表在没有指定字符集的状况下,才会采用默认字符集) PS:整理自《Java工程师修炼之道》
详细内容能够参考: MySQL字符集及校对规则的理解
Mysql索引使用的数据结构主要有BTree索引和哈希索引。对于哈希索引来讲,底层的数据结构就是哈希表,所以在绝大多数需求为单条记录查询的时候,能够选择哈希索引,查询性能最快;其他大部分场景,建议选择BTree索引。
Mysql的BTree索引使用的是B数中的B+Tree,但对于主要的两种存储引擎的实现方式是不一样的。
MyISAM: B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,则取出其data域的值,而后以data域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。
InnoDB: 其数据文件自己就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件自己就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,所以InnoDB表数据文件自己就是主索引。这被称为“聚簇索引(或汇集索引)”。而其他的索引都做为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不一样的地方。在根据主索引搜索时,直接找到key所在的节点便可取出数据;在根据辅助索引查找时,则须要先取出主键的值,在走一遍主索引。 所以,在设计表的时候,不建议使用过长的字段做为主键,也不建议使用非单调的字段做为主键,这样会形成主索引频繁分裂。 PS:整理自《Java工程师修炼之道》
详细内容能够参考: [干货:mysql索引的数据结构](https://www.jianshu.com/p/1775b4ff123a) [MySQL优化系列(三)--索引的使用、原理和设计优化](https://blog.csdn.net/Jack__Frost/article/details/72571540)
my.cnf加入如下配置,重启Mysql开机查询缓存
query_cache_type=1 query_cache_size=600000
Mysql执行如下命令也能够开启查询缓存
set global query_cache_type=1; set global query_cache_size=600000;
如上,开启查询缓存后在一样的查询条件以及数据状况下,会直接在缓存中返回结果。这里的查询条件包括查询自己、当前要查询的数据库、客户端协议版本号等一些可能影响结果的信息。所以任何两个查询在任何字符上的不一样都会致使缓存不命中。此外,若是查询中包含任何用户自定义函数、存储函数、用户变量、临时表、Mysql库中的系统表,其查询结果也不会被缓存。
缓存创建以后,Mysql的查询缓存系统会跟踪查询中涉及的每张表,若是这些表(数据或结构)发生变化,那么和这张表相关的全部缓存数据都将失效。
缓存虽然可以提高数据库的查询性能,可是缓存同时也带来了额外的开销,每次查询后都要作一次缓存操做,失效后还要销毁。 所以,开启缓存查询要谨慎,尤为对于写密集的应用来讲更是如此。若是开启,要注意合理控制缓存空间大小,通常来讲其大小设置为几十MB比较合适。此外,还能够经过sql_cache和sql_no_cache来控制某个查询语句是否须要缓存:
select sql_no_cache count(*) from usr;
关系性数据库须要遵循ACID规则,具体内容以下:
为了达到上述事务特性,数据库定义了几种不一样的事务隔离级别:
这里须要注意的是:Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多版本并发控制),经过保存修改的旧版本信息来支持并发一致性读和回滚等特性。
详细内容能够参考: 多是最漂亮的Spring事务管理详解
MyISAM和InnoDB存储引擎使用的锁:
表级锁和行级锁对比:
- **表级锁:** Mysql中锁定 **粒度最大** 的一种锁,对当前操做的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的几率最高,并发度最低,MyISAM和 InnoDB引擎都支持表级锁。
详细内容能够参考:
Mysql锁机制简单了解一下
当MySQL单表记录数过大时,数据库的CRUD性能会明显降低,一些常见的优化措施以下:
详细内容能够参考:
MySQL大表优化方案
欢迎关注个人微信公众号:"Java面试通关手册"(一个有温度的微信公众号,无广告,单纯技术分享,期待与你共同进步~~~坚持原创,分享美文,分享各类Java学习资源。)
最后,就是使用阿里云服务器一段时间后,感受阿里云真的很不错,就申请作了阿里云大使,而后这是个人优惠券地址.