- 有 MySQL 基础的同学
- 想要学习更加核心 MySQL 知识的同学
- 为工作技术进阶做准备的同学
数据库,是一个程序员的必备技能。而 MySQL 作为时下最流行的关系型数据库管理系统,甚至在可以预见的未来 MySQL 都将是最流行的关系型数据库管理系统。
研发 / 测试 / 前端 / 客户端… 无论你是哪个岗位,一定不会对 MySQL 陌生,且大概率使用过 INSERT、DELETE、UPDATE、SELECT 等命令来完成对数据记录的增删改查。
但是,你肯定也听同学、同事抱怨过 “MySQL 太复杂了”“太难了” 之类的话。这通常是在使用 MySQL 的过程中,遇到了错误或者是性能问题。如果缺乏有效的学习,你的 MySQL 技能提升将会遭遇瓶颈,陷入一段时间内原地打转的尴尬境地。而且 MySQL 的复杂性也很容易让人面临刚解决一个难题,下一个未知的难题又突然出现的状况。
为此,本专栏将常见、常用的 MySQL 技巧进行集合,并通过小案例知识点和企业级应用案例实战的方式,带领追求进步的你掌握 MySQL 的高级技能,提升职场竞争力。
课程模块:
本专栏由浅入深,从 MySQL 的基础知识点开始讲起,逐步过渡到进阶知识、高级特性与应用设计技巧等等。除了基础理论之外,专栏中包含有大量的真实操作案例,并在最后设置了两个数据库应用系统项目实战,达到学以致用的目的。专栏一共包含 7 个模块:
第一,MySQL 基础
主要对 MySQL 的基础应用与基本使用建议进行讲解,但并不涉及例如 MySQL 的安装、基本的增删改查语法。主要是讲解我们平时常见但又常常忽略的功能点,例如:聚合与分组聚合、用户与权限、数据备份与恢复等;
第二,MySQL 进阶
讲解 MySQL 的进阶知识点,即我们平时常用,但是难度较高、不易理解的知识点,熟练的掌握这些知识点,能够在使用上达到事半功倍的效果。内容涉及:事务隔离级别、锁对并发的影响、高级查询、死锁等等;
第三, MySQL 高级特性
讲解常见、常用的 MySQL 高级特性。毫无疑问,MySQL 提供的高级特性主要用于两个方面,一方面是使用上的优化技巧、另一方面是特殊的使用场景。想要高效的使用 MySQL,对于高级特性的掌握也是必备的技能;第四, 应用设计技巧与调优
针对两个方向进行讲解,一是应用的方案设计、二是实际问题的建议与调优。本章的内容不仅仅是理论层面的分析,更是结合了作者多年的工作经验与实际问题的处理办法;
第五, MySQL 的实现原理
为了做到知其然也知其所以然,这一模块对实现原理进行讲解。首先从高层次理清 MySQL 系统的逻辑架构、再去分析 SQL 解析器、查询优化器的实现原理,最后讲解 InnoDB 存储引擎以及事务的实现原理;
第六, 实践应用
理论结合实践是最好的学习方式。这一模块里我会对电商系统、慕课网的数据表进行设计,其中会应用到我在课程中所讲解的 Schema 设计规范、性能优化技巧等等知识点;
第七, 总结与思考
总结部分将会对本专栏的知识点做出总结,指出重点内容;展望部分对专栏以外的知识点做介绍,提供继续学习方向的指导;思考部分则留出开放性思考问题,以便讨论交流。
问题一:从文中的信息来看,count(n)或count(*)是走索引的,猜测sum()是因为不走索引导致的 问题二:书写顺序为select、from、where、group by、 order by、having
问题1 case when 经常统计、纵表转横表的时候用过,ifnull, if 个人相对用的少 问题2 这个亲身体会,mysql 5.x版本默认大小写不敏感,mysql 8 默认大小写敏感,修改的话必须是数据库初始化之前修改,之后更改是无效的
问:将时间转换为时间戳,并使用 int 或者 bigint 类型去存储,你觉得这样可行吗 ? 答:看正文的时候正好奇为啥没提到存储int/bigint时间戳,用int/bigint和datetime存储在不同项目都使用过,感受就是int/bigint计算上很方便。特别是当前端项目对于时间展示有不同的格式需求的时候,数据库中存储的是int/bigint(或者vo层转换)直接返回给前端,前端可以更方便的定制格式而不用先把datetime转成时间戳。但是如果没这方面的需求,那直接存储datetime就是最方便的,可以减少转换的次数。所以个人觉得,从存储角度上来说,如果没有格式定制的需求,直接存储datetime最省事。 问:大多数时候,我们会选择将主键设置为 bigint 数据类型,你知道这是为什么吗 ? 答:不知道
1.为什么执行flush logs?猜测可能mysql执行操作后不会立即将操作信息记录在binlog,而是停留在内存中由mysql服务器在合适的时机进行异步刷盘,执行flush logs来确保最新的数据库操作可能记录在binlog中,来防止数据恢复都是 2.不知道
问:如果你的表没有定义主键,你知道 MySQL 会怎么做吗 ? 答:Innodb表中在没有默认主键的情况下会生成一个6byte空间的自动增长主键 我需要创建一个学校库,存储教师、学生、院系等信息,你觉得叫做 school 好吗 ?为什么 ? 答:个人觉得业务初期可能没问题。但是学生表后期会膨胀,很有可能独立成一个库或者为这个表做备份库,如果这个学校库起名叫school,那学生库或者学生表的备份库起名字的时候选择会比较苦难,不大好起一个简要达意的名字,不知道这么考虑对不对。 问:我编写的 SQL 语句需要做多表的 join 操作,应该给哪些列建索引呢 ? 答:where子句中的字段
1. 用mybatis动态sql作批量录入 2. 可以考虑, 但此时sql耗时应基本集中在数据录入和更新索引的操作上, 性能受限于磁盘的因素应该比较大, 上多线程不如换ssd. 3. 单条录入需要mysql服务器每次都检查语法编译sql语句耗时较长, 批量和Load data可以省去很多这些事件, 但同样的批量录入这种形式增大了单条sql的大小及设置的package参数。此时单条sql从客户端发送到mysql服务器的时候会比较长,占用带宽。
1. a.自增主键. b.尽量保证字段小一些. c.适当的冗余存储. d. 尽量让列值非空. 2. where子句字段类型和操作值的类型不一致如varchar类型的列`year`判断时使用where year = '2020'; like模糊前缀匹配; 对于聚簇索引条件丢失前缀匹配; where中使用SQL函数; 查询不使用索引列. 3.
1. 环形哈希空间,添加节点后很多数据不需要移动。 2. 垂直拆分实现简单,而且水平拆分可能会导致where查询实现困难。 3. id决定了数据记录存放的库和表,可以定位到数据的存放位置。 4. 使用定时任务做同步,但是业务中直接查询结果由于定时任务可能延时可能变得不可信,需要自行校验 5.没想到什么好办法,就是自己维护一个userid和这些信息数据映射关系,并以此来找到userId再进行查询
一哥,有个问题没想明白,在事物隔离级别为可重复读的情况下,事物A第一次读取的数据为1800,然后事物B修改为2000,事物A再次读取还是1800,因为事物B没有进行提交,但是当事物B提交之后再读取还是1800,那2000去哪里了,是否要等事物A执行完毕之后,再次查询,才会读到最新的2000?还是说需要在一个新的会话中才能读取到最新的数据?
老师,假设我要查询每个用户能够接受的最大的预算的广告信息该怎么写 我目前的写法 SELECT user_id,MAX(budget) FROM ad_unit WHERE unit_status = 0 GROUP BY user_id 我还想看到这条广告的详细信息
1. 三阶 2. 如若联合索引使用了两个字段,应该是类似将两个字段进行封装变为一个node整体,然后按照字段顺序进行排序,如(name, salary),索引会将{name, salary}视为一个整体,数据优先按照name进行排序,name相同时按照salary排序,一直到叶子节点。 3. 前缀索引可能会适合一些字段内容较长,但存在数据头部的一段短数据区分度可能较高的数据。 4. 建立在频繁作为查询条件,且数据区分度较高的列以及表间关联列。对于文章中提到的覆盖索引,如果存在某个列值频繁使用的话,可能为了避免查询回表,也可以考虑对其建立索引。建索引就是为了查询快。
1.视图使用场景。目前使用经历,当数据分布在多个表中,且表之间通过id进行关联,无法直观的在可视化工具中看到数据之间的关系(直接看到的都是其他表的id),此时会考虑建立视图,方便查看。 2.视图的数据表区别和联系,目前知道的就是视图并不会存储数据,个人理解视图就像一个保存好的sql语句,可以随时执行;视图数据来自数据表;视图理论上不建议使用增删改,就如同它的名字,只用作查看即可。 3.- 4.删除视图后,母表不会受到影响,受影响的是依赖该视图的其他视图,此时其他视图会阻止删除该视图。
老师,我找到答案了。 首先CHAR(M)、VARCHAR(M)、TEXT(M)中M的都是代表最大存储字符的个数。区别在于,VARCHAR最多存65535个字节,而TEXT最多能存储65535个字符。所以理论上,TEXT能存的字符是VARCHAR的3倍。 比如,如果都是中文,utf8编码下VARCHAR最多只能存入65535/3=21844个汉字,此时M最大值只能填21844。但TEXT可以实打实存入65535个字符。TEXT最大容量是65535*3个字节? help命令真的很好用,谢谢老师
1. 不清楚,不过观察日志发现在`UPDATE,DELETE,INSERT`这种事件中日志记录的是table_id,而紧挨着的上面一条table_map事件就记录了操作的数据库.表名和tableid的映射,但是不明白为什么不直接记录,而要分开记录为两个事件。 2.在information_schema.innodb_tables中找到了table_id的列,但是值和binlog中记录的并不一致 3.
MySQL的权限数据表设计真的很不错
这一节加深了对缓存和以空间换时间的体会,果然知识都是相通的。
骑着猪找未来
阿斯拉菲
沁尘