热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL知识点(个人总结)

目录 1.MySQL架构设计图2.存储引擎MylSAM和InnoDB的区别3.MVCC(MultiversionConcurrencyControl)多版本并发控制4.事务5.索引

目录

 

1.MySQL架构设计图

2.存储引擎MylSAM和InnoDB的区别

3.MVCC(Multiversion Concurrency Control)多版本并发控制

4.事务

5.索引

6.锁

7.redo log 和 bin log

8.小表、大表驱动选择

9.mysql常用的优化

 




1.MySQL架构设计图

(图片来源于:《MySQL45讲》)

MySQL分为server层引擎层。引擎层是插件式的,常见的有MylSAM,InnoDB。InnoDB在MySQL 5.5.5版本以后成为了默认引擎。其中server层的查询缓存一般可以关闭(MySQL8.0后已移除查询缓存功能),查询缓存的设计是key,value的;将查询语句作为key,查询结果作为value,当查询语句有一个空格的改变,或者对其中一个表的数据有修改或者新增,查询缓存就失效了,所以建议关闭。


2.存储引擎MylSAM和InnoDB的区别


  1. 是否支持行级锁。MylSAM支持最小粒度的锁为表级锁,InnoDB支持行级锁和表级锁,默认为行级锁。
  2. 是否支持事务和crash-safe能力。MylSAM不支持事务和不具备crash-safe的能力,InnoDB都有。
  3. 是否支持外键。MylSAM不支持外键,InnoDB支持。不过《阿里Java开发手册》上强制不让使用外键与级联,一切外键概念必须在应用层面解决。以下为给出的解释:

       以学生和成绩的关系为例,学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的student_id,同时触发成绩表中的studengt_id更新,即成为级联更新。外键和级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。


4. 是否支持MVCC。MVCC为InnoDB独有,MVCC在高并发下比单纯的加锁更高效。MVCC可以使用 乐观(optimistic)锁 和 悲观(pessimistic)锁来实现;各数据库中MVCC实现并不统一。

5.是否有redo log。redo log(重做日志)为InnoDB独有,正是因为有redo log,当数据库发生异常重启的时候,数据不会丢失,所以InnDB有crash-safe能力。redo log 详细的在第7小节总结。


3.MVCC(Multiversion Concurrency Control)多版本并发控制

 


4.事务


5.索引


6.锁


7.redo log 和 bin log


8.小表、大表驱动选择


9.mysql常用的优化


     9.1 设计规范,好的优化应该从设计开始注意:


  1. 存储相同名称,相同类型的列时,数据类型应该设置为一致。一般用作关联的列,不一致会导致隐式转换的问题,导致索引失效。
  2. 设置合适的字符存储长度。可以节约数据库表空间和索引存储,且可以提升检索速度;列的字段越大,建立索引时所需要的空间也就越大,这样一页中所能存储的索引节点的数量也就越少也越少,在遍历时所需要的 IO 次数也就越多,索引的性能也就越差。例如存储flag标志的时候,应使用tinyint(1);
  3. char和varchar。char用于定义一个固定长度的字符串,范围(1-255)在定义字段时就必须指定长度,会预先分配存储空间,如果未达到指定长度时,会使用空格填充达到指定长度,如果数据长度差异较大时,会造成空浪费,且读取数据时候需要trim()一下去除空格。但是当数据长度固定(例:手机号,身份证号)时,使用char就很合适,因为char长度固定,在检索时不需要考虑边界问题,检索速度快于varchar;varchar是可变长字符串,不预先分配存储空间,使用起来更加灵活,但是长度不要超过5000个字符。如果长度超过5000个字符,应将字段类型定义为text。且独立出来一张表,使用主键关联,避免应该其他字段的索引效率。
  4. 将所有的列定义为NOT NULL。索引 NULL 列需要额外的空间来保存,所以要占用更多的空间进行比较和计算时要对 NULL 值做特别的处理。
  5. 表必须有主键。建议使用int或者bigint。

9.2 索引设计


  1. 单张表的索引,建议不要超过5个,超过5个就需要考虑表设计的合理性。过多索引会导致数据插入更新速度变慢。
  2. 常用设置索引的列。常用出现在where、order by、group by、distinct后面的列;用作表join的列。
  3. 数据区分度低的列不应该加索引。例:sex:0-女、1-男
  4. 业务上具有唯一性的字段,应设置为唯一索引
  5. varchar字段设置索引的时候,需要注意索引长度。不要全字段设置索引,一般不建议varchar字段设置索引。
  6. 经常查询的列,可巧妙运用覆盖索引。避免回表。
  7. 联合索引顺序。如果通过调换组合索引的位置,可以减少一个索引,那么应该把那个索引放在左边。若无这种情况,可以把区分度更高的列放在左边。

9.3 查询技巧

                 

 

 

 


 



推荐阅读
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了Paxos的世界中关于复制日志与状态机的概念和重要性。通过存储日志来实现数据的持久化,并通过日志流来记录数据的变化,而不是直接持久化数据本身。这样做的好处是简化了持久化存储的操作,并且方便多机之间的数据同步。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 数字账号安全与数据资产问题的研究及解决方案
    本文研究了数字账号安全与数据资产问题,并提出了解决方案。近期,大量QQ账号被盗事件引起了广泛关注。欺诈者对数字账号的价值认识超过了账号主人,因此他们不断攻击和盗用账号。然而,平台和账号主人对账号安全问题的态度不正确,只有用户自身意识到问题的严重性并采取行动,才能推动平台优先解决这些问题。本文旨在提醒用户关注账号安全,并呼吁平台承担起更多的责任。令牌云团队对此进行了长期深入的研究,并提出了相应的解决方案。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了sqlserver云存储和本地存储的区别,云存储是将数据存储在网络上,方便查看和调用;本地存储是将数据存储在电脑磁盘上,只能在存储的电脑上查看。同时提供了几种启动sqlserver的方法。此外,还介绍了如何导出数据库的步骤和工具。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
author-avatar
顽石1129_659
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有